我的代码:使用promise实现并发控制

479 阅读1分钟
//每次调用limit个
const limitLoad = (urls,handle,limit)=>{
    let _urls = Object.assign([],urls);//复制出来源,防止操作的时候误修改
    let promise = _urls.splice(0,limit).map((url,index)=>{
        return handle(url).then(()=>index)
    })
    let p = Promise.race(promise);
    for(let i =0;i<_urls.length;i++){
        p = p.then(index=>{
            promise[index] = handle(_urls[i]).then(()=>index)
        return Promise.race(promise)
        })
    }
}

//假设接口们
const $urls = [{
    info:'url1',
    time:3000
},{
    info:'url2',
    time:4000
},{
    info:'url3',
    time:1000
},{
    info:'url4',
    time:6000
},{
    info:'url5',
    time:500
},{
    info:'url6',
    time:7000
},{
    info:'url7',
    time:5000
}]

//假设调用接口的实际方法
const loadUrl = (url)=>{
    return new Promise((resolve,reject)=>{
        console.log(`${url.info}开始调用`)
        setTimeout(()=>{
            console.log(`${url.info}调用结束`);
            resolve()
        },url.time)
    })
}

limitLoad($urls,loadUrl,3)