串联 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
});