// 模塊導入 // 控制併發 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控制併發數量。加了本身的理解,以爲好繞啊,也許有錯的。啦啦啦,可是我以爲這裏理解的通順。數組
輸出結果: 併發