读源码async-pool有感:
async function asyncPool(poolLimit, array, iteratorFn) {const ret = []; // 用于存放所有的promise实例const executing = []; // 用于存放目前正在执行的promisefor (const item of array) {// 防止回调函数返回的不是promiseconst p = Promise.resolve().then(() => iteratorFn(item, array));ret.push(p);// then回调中,当这个promise状态变为fulfilled后,将其从正在执行的promise列表executing中删除// 这里p.then()会返回一个promise实例对象const e = p.then(() => executing.splice(executing.indexOf(e), 1));executing.push(e);if (executing.length >= poolLimit) {// 一旦正在执行的promise列表数量等于限制数,就使用Promise.race等待某一个promise状态发生变更,// 状态变更后,就会执行上面then的回调,将该promise从executing中删除,// 然后再进入到下一次for循环,生成新的promise进行补充await Promise.race(executing);}}return Promise.all(ret);}
测试代码:
const timeout = (i) => {console.log('开始', i);return new Promise((resolve) => setTimeout(() => {resolve(i);console.log('结束', i);}, i));};(async () => {const res = await asyncPool(2, [1000, 5000, 3000, 2000], timeout);console.log(res);})();
