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的限制和机器性能)。