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

输出结果: 并发

本站公众号
   欢迎关注本站公众号,获取更多信息