关键点
-
- new promise 一经创建,立即执行
-
- 使用 Promise.resolve().then 可以把任务加到微任务队列,防止立即执行迭代方法
-
- 微任务处理过程中,产生的新的执行微任务,会在同一事件循环内,追加到微任务队列里
-
- 使用 race 在某个任务完成时,继续添加任务,保持任务按照最大并发数进行
-
- 任务完成后,需要从 doingTasks 中移出
function limit (count, array, iterateFunc) {
const tasks = [];
const doingTasks = [];
let i = 0;
const enqueue = () => {
if (i === array.length) {
return Promise.resolve();
}
const task = Promise.resolve().then(() => iterateFunc(array[i++]));
tasks.push(task);
const doing = task.then(() => doingTasks.splice(doingTasks.indexOf(task), 1));
doingTasks.push(doing);
const res = doingTasks.length >= count ? Promise.race(doingTasks) : Promise.resolve();
return res.then(enqueue);
};
return enqueue().then(() => Promise.all(tasks));
}
测试
const timeout = i => new Promise(resolve => setTimeout(() => {
resolve(i);
}, i));
limit(3, [1000, 2000, 3000, 4000, 5000, 6000], timeout).then((res) => {
console.log("最后的所有结果汇总--res---", res);
});