1.Promise 的三种状态
Pending----Promise 对象实例创建时候的初始状态
Fulfilled---- 可以理解为成功的状态
Rejected---- 可以理解为失败的状态
2.promise 的链式调用
每次调用返回的都是一个新的 Promise 实例 (这就是 then 可用链式调用的原因);
如果 then 中返回的是一个结果的话会把这个结果传递下一次 then 中的成功回调;
如果 then 中出现异常, 会走下一个 then 的失败回调;
在 then 中使用了 return,那么 return 的值会被 Promise.resolve() 包装;
then 中可以不传递参数,如果不传递会透到下一个 then 中;
catch 会捕获到没有捕获的异常
let p = function (v) {
let x = null;
return new Promise((resolve, reject) => {
if (v) {
resolve(v)
}
reject(v);
})
}
p(2).then(res => {
x = '233';
return p(res + 1)
})
.then(res => {
console.log(x);
return p(res + 2)
})
.then(res => {
console.log(x);
console.log(res);
})
p(2).then(res => {
return p()
//如果 then 中出现异常, 会走下一个 then 的失败回调;
//由于下一个 then 没有失败回调,就会继续往下找,如果都没有,就会被 catch 捕获到
})
.then(res => {
return p(res + 1)
})
.then(res => {
console.log(res);
})
.catch(err => {
console.log('err', err)
})
3.promise的缺点:比如无法取消 Promise,错误需要通过回调函数捕获。
4.Promise.all()
Promise.all方法接受一个数组作为参数,
p1、p2、p3都是 Promise 实例,如果不是,
就会先调用下面讲到的Promise.resolve方法,
将参数转为 Promise 实例,再进一步处理。
(Promise.all方法的参数可以不是数组,
但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)
eg:
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,
此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,
此时第一个被reject的实例的返回值,会传递给p的回调函数。
const p1 = new Promise((resolve, reject) => {
resolve('p1');
})
const p2 = new Promise((resolve, reject) => {
reject('p2'); //第一个被reject的实例的返回值,会传递给p的回调函数
})
const p3 = new Promise((resolve, reject) => {
reject('p3');
})
const p = Promise.all([p1, p2, p3]);
p.then(res => {
console.log('p all', res);
}).catch(err => {
console.log('err', err)
})
如果作为参数的 Promise 实例,
自己定义了catch方法,
那么它一旦被rejected,
并不会触发Promise.all()的catch方法。
const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result)
.catch(e => e);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result)
.catch(e => e);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
笔记摘自:
http://es6.ruanyifeng.com/#docs/promise#Promise-all
https://www.infoq.cn/article/zwowtega7KjC4Ad-trp4