串行是指,第一个 promise 执行结束后,开始执行第二个 promise,因为第二个 promise 可能需要用到第一个 promise 的结果
- 不使用 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 ] }
- 使用 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 ] }