node-day6

// 模塊導入
// 控制併發 async 模塊   用到async模塊mapLimit(arr, limit, iterator, callback) 接口
var async  = require('async');
// 返回內容函數
var current = 0;// 計數器,控制5條
var urls = [];//僞造一個假的url請求數組
for(var i = 0; i < 30; i++) {
    urls.push('http://datasource_' + i);
}
function fetchUrl(url ,callBack){
    // 模擬
    // callBack()
    var delay = parseInt((Math.random() * 10000000) % 2000, 10);//模擬延時,爲隨機數
    current++;//每調用一次,計數器加1
    console.log("當前正在抓取的地址是"+ url+"併發數爲:" +current+"耗時:"+delay+"秒");
    setTimeout(function(){  //setTimeout 當前js所有執行完後才執行  當第五條console.log↑↑執行完後開始走setTimeout這個setTimeout 
                            // 是抓取完的url的setTimeout,(每一個url都會調用一次fetchUrl,就都會有個setTimeout,這個setTimeout至關於請求的耗時)
        console.log("我是時延裏的內容"+current);
        current--;  //當執行完一條時,計數減一
        callBack(null,url+'content');
        console.log(url+"當前完成地址");
    },delay)
}

// 控制併發數  mapLimit(arr, limit, iterator, callback) 接口  iterator迭代函數
async.mapLimit(urls,5,function(url,callback){  //mapLimit 可自動拼接每次返回的結果 最後放入res裏  url 爲iterator迭代函數的第一個參數,表明每次要去調用fetchUrl的地址,是urls裏的一個子元素; 這裏的callback 是mapLimit已經作好的callback ,
                                                // 至關於把callback結果返回給了mapLimit第三個參數,第三參數會本身在內部作一個拼接,最後放入res裏
    fetchUrl(url,callback);
},function(error,res){
    console.log('final:');
    // console.log(res);
})

l啦啦啦,使用async控制併發數量。加了本身的理解,以爲好繞啊,也許有錯的。啦啦啦,可是我以爲這裏理解的通順。數組

輸出結果: 併發

本站公眾號
   歡迎關注本站公眾號,獲取更多信息