关键点
-
- 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);
});