源码学习

es6 Promise 学习笔记4 Promise.race

2020-07-17  本文已影响0人  草祭木初

定义:Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

例子

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

源码

export default function race(entries) {
  /*jshint validthis:true */
  let Constructor = this;

  if (!isArray(entries)) {
    return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));
  } else {
    return new Constructor((resolve, reject) => {
      let length = entries.length;
// entries 里的所有Promise都会被执行
      for (let i = 0; i < length; i++) {
// 根 Promise 的resolve 和 reject 被传到了 entry的then里面
// 所以 最先进入 then 的 entry 产生的结果会被返回
// 因为 当根resolve 或 reject 被执行后 它的状态就变了 不再是 PENDING,所以后来entry进入then后 根Promise 的resolve 或 reject 不会被执行

// 其实这里可以改造一下 让根Promise的状态改变后 其他 entry都不进入then,大家可以自己想想
        Constructor.resolve(entries[i]).then(resolve, reject);
      }
    });
  }
}

es6 Promise 学习笔记1 基础代码解析
es6 Promise 学习笔记2 链式调用
es6 Promise 学习笔记3 Promise.all
es6 Promise 学习笔记4 Promise.race

上一篇 下一篇

猜你喜欢

热点阅读