深入理解ES6-11.Promise(2)

79 阅读2分钟

串联 Promise

每次调用 then()catch() 方法时,实际创建并返回了另一个 Promise,只有当第一个 Promise 完成或拒绝后,第二个才会被解决。

then() 的返回值

  1. then 里面没有写 return 语句或 return undefined 时,返回一个 fulfilled 状态的 Promise ,且他回调函数的参数值为 undefined
  2. then 里面 return 的是非 Promise 对象或基础类型值时,返回一个 fulfilled 状态的 Promise,且他回调函数的参数值为返回的值
  3. then 里面抛出一个错误的时候,返回一个 rejected 状态的 Promise,且将抛出的错误作为回调函数的参数
  4. 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 被 resolvereject 后,返回的新的Promise就会被 resolvereject

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