- Promise是ES6新增的用于异步编程的一个类。通过链式调用的形式可以解决以往异步编程出现的“回调地狱”的情况。
- Promise本质上还是调用的回调函数,其内部维护了状态、兑现回调、拒绝回调,在状态变更时回调对应的函数。
- Promise对象有then()、catch()和finally()三个成员方法,都会返回一个新的Promise对象,这是实现“期约链”的核心。
- Promise还有resolve()、reject()、all()、race()等在原型对象上的静态方法,分别返回“fulfilled”和“rejected”状态的Promise对象,以及并行执行多个期约。
- then()方法接收两个函数类型参数,第一个和第二个函数分别在Promise被兑现和拒绝(调用reject函数或抛出异常)时被调用。
then()方法的函数参数的返回值决定了Promise对象的状态:
若返回非Promise类型的值,则期约对象立即解决并被兑现;若抛出异常则会被拒绝;而返回Promise类型的值,期约状态会保持“pendding”待解决状态直到该返回的期约被兑现或拒绝,此时期约会以同样的值被兑现或拒绝。
new Promise((resolve, reject) => {
setTimeout(() => {resolve('2s')}, 2000);
})
.then(val => val, val => {console.log('rejected:'+val);return val;});
- catch()会在Promise被拒绝时被调用,相当于then(null, fn)
new Promise((resolve, reject) => {
setTimeout(() => {reject('2s')}, 2000);
// 或者抛出异常
// throw new Error('msg');
})
.catch(val => {console.log('rejected:'+val);return val;});
- finally()会在Promise落定之后被调用,不论兑现或拒绝;回调函数无参数;其返回值一般被忽略;若抛出异常,则以该异常值拒绝期约。
new Promise((resolve, reject) => {
setTimeout(() => {resolve('2s')}, 2000);
})
.finally(() => {console.log('finally');});
- Promise.resolve()、Promise.reject()会返回一个以传入值兑现或拒绝的Promise对象。
- Promise.all()可以并行执行多个期约,它接受一个期约对象的数组。它返回的期约对象会在传入的期约中的任何一个期约被拒绝时拒绝;否则以这些期约兑现的值组成的数组来兑现。
- Promise.race()也可以并行执行多个期约,但是它返回的期约对象会在这些期约中有一个被兑现或拒绝时立即兑现或拒绝。