串联 Promise
每次调用 then() 或 catch() 方法时,实际创建并返回了另一个 Promise,只有当第一个 Promise 完成或拒绝后,第二个才会被解决。
then() 的返回值
- 当
then里面没有写return语句或return undefined时,返回一个fulfilled状态的Promise,且他回调函数的参数值为undefined - 当
then里面return的是非Promise对象或基础类型值时,返回一个fulfilled状态的Promise,且他回调函数的参数值为返回的值 - 当
then里面抛出一个错误的时候,返回一个rejected状态的Promise,且将抛出的错误作为回调函数的参数 - 当
then里面return的是Promise对象时,返回一个状态相同且回调函数的参数值相同的Promise对象
let pl = new Promise(function (resolve, reject) {
resolve(42);
});
pl.then( function (value) {
console.log(value); // 42
return value + 1;
}).then(function (value) {
console.log(value); // 43
});
Promise 链的一个重要特性就是可以给下游的 Promise 传递数据。
多个 Promise
Promise.all()
只接受一个参数,该参数是一个含有多个 Promise 的可迭代对象,只有可迭代对象中所有的 Promise 都被 resolve 后,返回的新的Promise才会被 resolve。
let pl = new Promise(function (resolve, reject) {
resolve(42);
});
let p2 = new Promise(function (resolve, reject) {
resolve(43);
});
let p3 = new Promise(function (resolve, reject) {
resolve(44);
});
let p4 = Promise.all([pl, p2, p3]);
// 当 p1,p2,p3都处于已解决状态,才会执行p4的then()方法
p4.then(function (value) {
console.log(value); // [42,43,44]
});
传入返回的 Promise 的参数是一个包含所有解决值的数组,数组中值的顺序按照 Promise 被解决的顺序存储。
传入的多个 Promise 中,只要有一个被 reject,那么返回的 Promise 会立即执行 reject。且返回的 Promise 接收的不是数组了,而是被拒绝的那个 Promise 的返回值。
let pl = new Promise(function (resolve, reject) {
resolve(42);
});
let p2 = new Promise(function (resolve, reject) {
reject(43);
});
let p3 = new Promise(function (resolve, reject) {
resolve(44);
});
let p4 = Promise.all([pl, p2, p3]);
// p2被拒绝后,立即执行p4的then()方法,不会再等p1,p3执行
p4.catch(function (value) {
console.log(value); // 43
});
Promise.race()
只接受一个参数,该参数是一个含有多个 Promise 的可迭代对象,只要可迭代对象中有一个Promise 被 resolve 或 reject 后,返回的新的Promise就会被 resolve 或 reject。
let p2 = new Promise(function (resolve, reject) {
resolve(43);
});
// 这样创建的已解决状态的 Promise,会比使用构造函数返回的快,所以最先执行完。
let p1 = Promise.resolve(42);
let p3 = new Promise(function (resolve, reject) {
resolve(44);
});
let p4 = Promise.race([p1, p2, p3]);
p4.then(function (value) {
console.log(value); //42
});