概念:Promise主要解决了异步调用互相依赖,就是常说的死亡回调。当你调用一系列异步方法时,使用promise可以让多个操作按照你的想法执行,实现序列化。
Promise有3种状态:
- Pending:进行中
- Resolved(Fulfilled):已完成
- Rejected:已失败
Promise构造器接受一个函数作为参数,这个函数有两个参数:resolve,reject,分别代表这个Promise实例成功之后的回调函数和失败之后的回调函数。
let promise = new Promise(function (resolve, reject) { var a = 1 if (a == 1) { resolve(a) } else { reject(error) } }) promise.then(function (value) { console.log(value); }).catch(function (error) { console.log(error); }) // 结果输出 1
promise多步调用:
let ajax=function(){ console.log('执行'); return new Promise(function(resolve){ setTimeout(function () { resolve() }, 2000); }) }; ajax() .then(function(){ console.log("第一次then") return new Promise(function(resolve){ setTimeout(function () { resolve() }, 2000); }); }) .then(function(){ console.log("第二次then") return new Promise(function(resolve){ setTimeout(function () { resolve() }, 2000); }); }) .then(function(){ console.log('执行结束') })
捕获错误:
var promise = new Promise(function (resolve, reject) { let a = 7 if (a < 5) { resolve(a) } else { reject() } }) promise.then(function (value) { console.log(value++) return value }).catch(function (error = '出错了') { console.log(error) })
案例1:Promise.all 方法 (作用:在指定的所有Promise实例完成后执行)
let add1 = () => { console.log('执行1'); return new Promise(function(resolve){ setTimeout(function(){ console.log("执行1完成") resolve() },2000) }) } let add2 = () => { console.log('执行2'); return new Promise(function(resolve){ setTimeout(function(){ console.log('执行2完成') resolve() },2000) }) } Promise.all([ add1(), add2() ]).then(() => { setTimeout(() => { console.log("执行结束") },2000) })
案例2:Promise.race 方法(作用:在指定的所有Promise实例中任何一个实例完成后执行)
let add1 = () => { console.log('执行1'); return new Promise(function(resolve){ let timer = setTimeout(function(){ console.log("执行1完成") resolve() },5000) }) } let add2 = () => { console.log('执行2'); return new Promise(function(resolve){ let timer = setTimeout(function(){ console.log('执行2完成') resolve() },2000) }) } Promise.race([ add1(), add2() ]).then(() => { setTimeout(() => { console.log("执行结束") add1 = null add2 = null },2000) })