ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用Promise race异步控制并发数量

2020-12-30 15:03:31  阅读:416  来源: 互联网

标签:resolve const executing race Promise 异步控制 promise array


function asyncPool(poolLimit, array, iteratorFn) {
    let i = 0;
    const ret = [];
    const executing = [];
    const enqueue = function () {
        // 边界处理,array为空数组
        if (i === array.length) {
            return Promise.resolve();
        }
        // 每调一次enqueue,初始化一个promise
        const item = array[i++];
        const p = Promise.resolve().then(() => iteratorFn(item, array));
        // 放入promises数组
        ret.push(p);
        // promise执行完毕,从executing数组中删除
        const e = p.then(() => executing.splice(executing.indexOf(e), 1));
        // 插入executing数字,表示正在执行的promise
        executing.push(e);
        // 使用Promise.rece,每当executing数组中promise数量低于poolLimit,就实例化新的promise并执行
        let r = Promise.resolve();
        if (executing.length >= poolLimit) {
            r = Promise.race(executing);
        }
        // 递归,直到遍历完array
        return r.then(() => enqueue());
    };
    return enqueue().then(() => Promise.all(ret));
}

//从array第1个元素开始,初始化promise对象,同时用一个executing数组保存正在执行的promise
//不断初始化promise,直到达到poolLimt
//使用Promise.race,获得executing中promise的执行情况,当有一个promise执行完毕,继续初始化promise并放入executing中
//所有promise都执行完了,调用Promise.all返回

//使用方法
const timeout = i => new Promise(resolve => setTimeout(() => resolve(i), i));
asyncPool(2, [1000, 5000, 3000, 2000], timeout).then(results => {
   console.log('results')
});

  

标签:resolve,const,executing,race,Promise,异步控制,promise,array
来源: https://www.cnblogs.com/hy96/p/14211465.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有