Promise 实现串行

204 阅读1分钟

串行是指,第一个 promise 执行结束后,开始执行第二个 promise,因为第二个 promise 可能需要用到第一个 promise 的结果

  1. 不使用 async/await
Promise.queue = function (promises) {
    const result = []
    return new Promise((resolve, reject) => {
        promises.reduce((prePromise, curPromise) => {
            // curPromise 会执行并返回一个 Promise,将 res 传给后面的 then
            return prePromise.then(curPromise).then((res => {
                result.push(res)
            })).catch(err => reject(err))
        }, Promise.resolve()).then(() => resolve(result))
    })
}

reduce 第二个参数传入的 Promise.resolve() 实际上替换了第一个 promise,数组中第一个 promise 实际上是迭代中的第一个 curPromise。

执行代码:(测试数据代码来自:如何控制Promise的串行执行?

const funcArr = [
  () =>
    new Promise((resolve) => {
      setTimeout(() => resolve(1), 2000);
    }),
  () =>
    new Promise((resolve) => {
      setTimeout(() => resolve(2), 1000);
    }),
  () =>
    new Promise((resolve) => {
      setTimeout(() => resolve(3), 3000);
    }),
];

console.log(Promise.queue(funcArr, 0).then((res) => console.log({ res })));
// 6秒后 打印:{ res: [ 1, 2, 3 ] }
  1. 使用 async/await
Promise.queue1 = function (arr) {
  const result = [];
  return new Promise(async (resolve, reject) => {
    for (let p of arr) {
      try {
        const res = await p();
        result.push(res);
      } catch (err) {
        reject(err);
      }
    }
    resolve(result);
  });
};

Promise.queue1(funcArr).then((res) => console.log({ res }));
// 6秒后 打印:{ res: [ 1, 2, 3 ] }