有一个数组,里面都是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
的基本思路。
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决