有一个数组,里面都是promise的实例。代码实现如下要求:每次执行数组里的前n个实例,在这n个promise实例执行完后(即这n个promise的状态都是Fulfilled或Rejected)再开始下次n个实例执行,直到数组里的实例都被执行完
有一个数组,里面都是promise的实例。代码实现如下要求:每次执行数组里的前n个实例,在这n个promise实例执行完后(即这n个promise的状态都是Fulfilled或Rejected)再开始下次n个实例执行,直到数组里的实例都被执行完
const MAX_N = 10;
let n = MAX_N;
let currentRunLen = MAX_N;
const promiseTask = (promises) => {
if (n < currentRunLen || !promises.length) {
return;
}
currentRunLen = Math.min(currentRunLen, promises.length);
n = 0;
promises.splice(0, currentRunLen).forEach((p) => {
p().then((i) => {
console.log(`resolve:${i}`);
}).catch((i) => {
console.log(`reject:${i}`);
}).finally(() => {
n += 1;
promiseTask([...promises]);
});
});
};
// 测试
const promises = Array.from({ length: 20 }).map((o, i) => () => new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.5) {
resolve(i);
} else {
reject(i);
}
}, 1000);
}));
promiseTask(promises);
不知道思否这代码格式化这么回事,你复制到编辑器中格式化一下吧!!
楼上的 Promise.prototype.allSettle
是正解,在此接口提出之前,知乎有人讨论过这个缺陷,但是原问题的链接不好找。
可以看下 这一篇博文,虽然排版比较弱,但还是可以厘清使用 Promise.prototype.all
模拟实现 Promise.prototype.allSettle
的基本思路。
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.4k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
6 回答1.2k 阅读