100次 `for` 循环是同步执行的,也就是说一开始就会产生 100 个 `并发任务`,但由于并发数的控制,只能进去 5 个,后 95 个的 `Promise` 都被丢弃了,当后面 95 次 `异步任务` 触发的时候实际上都是用的前面 5 次 `闭包` 中的 `reslove` 和 `reject` 因此这里需要用一个 `map` 缓存一下 `Promise` 的 `resolve` 和 `reject` const createPool = (task, { concurrency } = {}) => { let runningCount = 0; const pool = []; const promiseMap = new Map(); return function (i) { return new Promise((resolve, reject) => { promiseMap.set(i, { resolve, reject }); pool.push(() => task(i)); function run() { while (pool.length && runningCount { const { resolve } = promiseMap.get(val) resolve(val) }) .catch((e) => reject(e)) .finally(() => { runningCount--; run(); }); } } run(); }); }; };