在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML5  HTML/ 使用async/await 如何實(shí)現(xiàn)高效率多層并發(fā)

使用async/await 如何實(shí)現(xiàn)高效率多層并發(fā)

let count = 1;
let startTime = new Date();
const timePromiseFactory = (time) => {
    return new Promise((resolve, reject) => {
    setTimeout(() => {
    console.log(`第${count++}條請(qǐng)求到達(dá),用時(shí)${new Date() - startTime}毫秒`);
        resolve(time)
    }, time);
 })
}
function laucher() {
 const times1 = [3000, 1000, 4000]; //第一層請(qǐng)求
 const times2_1 = [2000, 3000, 1000, 2000]; //第二層請(qǐng)求,第一層請(qǐng)求的第一個(gè)請(qǐng)求到達(dá)后觸發(fā)
 const times2_2 = [6000, 3000]; //第二層請(qǐng)求,第一層請(qǐng)求的第二個(gè)請(qǐng)求到達(dá)后觸發(fā)
 const times2_3 = [4000]; //第二層請(qǐng)求,第一層請(qǐng)求的第三個(gè)請(qǐng)求到達(dá)后觸發(fā)
 times1.map((time) => timePromiseFactory(time).then(function (time) {
      if (time === 3000) {
         times2_1.map((time) => timePromiseFactory(time))
       } else if (time === 1000) {
         times2_2.map((time) => timePromiseFactory(time))
       } else {
         times2_3.map((time) => timePromiseFactory(time))    }
  })); 
          
}
laucher();
輸出  第1條請(qǐng)求到達(dá),用時(shí)1005毫秒
VM146:6 第2條請(qǐng)求到達(dá),用時(shí)3010毫秒
VM146:6 第3條請(qǐng)求到達(dá),用時(shí)4003毫秒
VM146:6 第4條請(qǐng)求到達(dá),用時(shí)4011毫秒
VM146:6 第5條請(qǐng)求到達(dá),用時(shí)4013毫秒
VM146:6 第6條請(qǐng)求到達(dá),用時(shí)5013毫秒
VM146:6 第7條請(qǐng)求到達(dá),用時(shí)5013毫秒
VM146:6 第8條請(qǐng)求到達(dá),用時(shí)6012毫秒
VM146:6 第9條請(qǐng)求到達(dá),用時(shí)7011毫秒
VM146:6 第10條請(qǐng)求到達(dá),用時(shí)8004毫秒

像文件讀取,網(wǎng)站爬蟲這些程序,很多時(shí)候要實(shí)現(xiàn)多層并發(fā),以上簡(jiǎn)單模擬了2層并發(fā),可以看到8秒后輸出10個(gè)請(qǐng)求,理論來(lái)說(shuō)如果沒有并發(fā)的限制下實(shí)現(xiàn)了最高效率的并發(fā)執(zhí)行,上面使用的是promise,如何把其改寫為async/await,也就是利用async/await,改寫以上程序,程序中不能出現(xiàn)then方法,并在8秒內(nèi)輸出10個(gè)請(qǐng)求

回答
編輯回答
青瓷

你的例子太過(guò)于復(fù)雜,什么第一層第二層的,看了老半天。

提煉你的要點(diǎn):1、并發(fā) 2、高效率

1、并發(fā)

使用Promise.all就行了。比如:

await Promise.all([p1, p2, p3]);

或者直接執(zhí)行

for (let i = 0; i < datas.length; i++) {
    let info  = datas[i];
    sleep(info).then((value) => {
      console.log(value);
    });
}

參考:https://segmentfault.com/q/10...

2、高效率。
何為高效率?只不過(guò)就是你想控制并發(fā)數(shù)罷了。要么自己實(shí)現(xiàn)計(jì)數(shù),要么使用第三方封裝好的。比如async,設(shè)置并發(fā)20個(gè)

var mapLimit = require("async/mapLimit");
mapLimit(datas, 20, async function(info, callback){

    return await sleep(3);

}, function(err, result){

});

如果想弄清楚原理,這里貼一個(gè)函數(shù),可以控制并發(fā):

function map(arr, fn, concurrency) {

  concurrency = concurrency || 1;

  return new Promise(function(resolve, reject) {

    var completed = 0;
    var started = 0;
    var running = 0;
    var results = new Array(arr.length);

    (function replenish() {
      if (completed >= arr.length) {
        return resolve(results);
      };

      while (running < concurrency && started < arr.length) {
        running++;
        started++;

        var index = started - 1;
        console.log('hd', arr[index], arr[index], index);
        fn.call(arr[index], arr[index], index) // item,index
          .then(function(result) {
            // console.log('done');
            running--;
            completed++;
            results[index] = result;

            replenish();
          })
          .catch(reject);
      }
    })();
  });
}
2017年4月14日 15:43
編輯回答
糖果果
function laucher() {
    const times1 = [3000, 1000, 4000];
    //第一層請(qǐng)求
    const times2_1 = [2000, 3000, 1000, 2000];
    //第二層請(qǐng)求,第一層請(qǐng)求的第一個(gè)請(qǐng)求到達(dá)后觸發(fā)
    const times2_2 = [6000, 3000];
    //第二層請(qǐng)求,第一層請(qǐng)求的第二個(gè)請(qǐng)求到達(dá)后觸發(fā)
    const times2_3 = [4000];
    //第二層請(qǐng)求,第一層請(qǐng)求的第三個(gè)請(qǐng)求到達(dá)后觸發(fā)
    times1.forEach((time)=>{
        (async()=>{
            await timePromiseFactory(time);
            if (time === 3000) {
                times2_1.forEach((time)=>{
                    timePromiseFactory(time);
                });
            } else if (time === 1000) {
                times2_2.forEach((time)=>{
                    timePromiseFactory(time);
                });
            } else {
                times2_3.forEach((time)=>{
                    timePromiseFactory(time);
                });
            }
        }
        )();
        console.log(time);
    }
    );
}
2018年1月19日 03:58