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

600 阅读1分钟

code1

//每次调用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)

code2

// 请求列表
const requestList = [
    () =>
        new Promise(resolve => {
            console.log('star', 1);

          setTimeout(() => {
            console.log('done', 1);
            resolve(1);
          }, 1 * 1000);
        }),
        () =>
            new Promise(resolve => {
                console.log('star', 2);

              setTimeout(() => {
                console.log('done', 2);
                resolve(2);
              }, 3 * 1000);
            }),() =>
                new Promise(resolve => {
                console.log('star', 3);

                  setTimeout(() => {
                    console.log('done', 3);
                    resolve(3);
                  }, 7 * 1000);
                }),() =>
                    new Promise(resolve => {
                console.log('star', 4);

                      setTimeout(() => {
                        console.log('done', 4);
                        resolve(4);
                      }, 0 * 1000);
                    }),() =>
                        new Promise(resolve => {
                console.log('star', 5);

                          setTimeout(() => {
                            console.log('done', 5);
                            resolve(5);
                          }, 3 * 1000);
                        }),() =>
                            new Promise(resolve => {
                console.log('star', 6);

                              setTimeout(() => {
                                console.log('done', 6);
                                resolve(6);
                              }, 2 * 1000);
                            })
];

const parallelRun = (limit)=>{
   let currRequest = 0;// 当前并行的请求

   const main = ()=>{
    if(currRequest<=limit && requestList.length){ 
       
        currRequest++;
        const memoR = requestList.shift()
        memoR().finally(()=>{
            currRequest--;
            main()
        })
    }
   }
   for(let i =0;i<limit;i++){
    main()

   }
}
parallelRun(3)