Promise.all 串行处理的一种实现

1,311 阅读1分钟

promise是我在js中经常使用的模块,可以方便的实现串行逻辑,但是面对数组任务的时候,promise自带的方法就不太好用了,一般我是使用Promise.all(),但是它是并行任务的。所以干脆我自己实现了一个Promise.all的串行版本

直接上代码

PromiseQueue(arr, promiseFunc, resolveDone, rejectDone) {
    return new Promise((resolve, reject) => {
      let i = 0;
      let promise = Promise.resolve();
      arr.forEach((val) => {
        promise = promise.then(() => {
          return promiseFunc(val)
            .then((res) => {
              resolveDone(res);
              i++;
              if (i === arr.length) resolve.call(undefined, "finish");
            })
            .catch((err) => {
              rejectDone(err);
              i++;
              if (i === arr.length) reject.call(undefined, "finish");
            });
        });
      });
    });
  },

使用例子:

PromiseQueue(
    arrDownloadPhotoUrl, //promise函数参数数组集合
    downloadPhoto, //单个任务的promise函数
    (res) => { //单个任务执行成功的回调函数
      console.log(res);
    },
    (err) => { //单个任务异常的回调函数
      console.log(err);
    }
  )
  .then((res) => { //所有
    console.log(res);
    outputExcelFile("./result" + ".xlsx", arrPhotoStatus);
  })
  .catch((res) => {
    console.log(res);
    outputExcelFile("./result" + ".xlsx", arrPhotoStatus);
  });

大致的思路就是把 单个promise函数的参数先放到固定的数组里,然后顺序执行,最后输出结果;这样也能实现“伪线程”的设计,如果想要加快速度的话,开启多个PromiseQueue函数就可以了(并行速度取决于node的限制和机器性能)。