// 模块导入 // 控制并发 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控制并发数量。加了本身的理解,以为好绕啊,也许有错的。啦啦啦,可是我以为这里理解的通顺。数组
输出结果: 并发