首页 > Node.js里callback()的疑惑?

Node.js里callback()的疑惑?

lz初学nodejs,今天根据教程遇到如下代码:

var async = require('async');

var concurrencyCount = 0;
var fetchUrl = function (url, callback) {
  var delay = parseInt((Math.random() * 10000000) % 2000, 10);
  concurrencyCount++;
  console.log('现在的并发数是', concurrencyCount, ',正在抓取的是', url, ',耗时' + delay + '毫秒');
  setTimeout(function () {
    concurrencyCount--;
    callback(null, url + ' html content');
  }, delay);
};

var urls = [];
for(var i = 0; i < 30; i++) {
  urls.push('http://datasource_' + i);
}

async.mapLimit(urls, 5, function (url, callback) {
  fetchUrl(url, callback);
}, function (err, result) {
  console.log('final:');
  console.log(result);
});

疑问:

  fetchUrl (url, callback){...}这里的callback()怎么变成调用function (err, result) {...}了?我的理解是应该有函数实例调用fetchUrl(url, callback)时,直接写个回调,是不是async这个库规定了这么写?

首先,程序中的urls数组中包含30个URL,要对这30个URL进行请求并不难,但是要对这30个URL请求时控制并发数量,并且在所有请求结束的时候统一返回所有结果,由于Node.js的异步特性,这很不好实现。所以代码中用到了并发控制的库:async.js。

async.mapLimit(urls, 5, function (url, callback) {
  fetchUrl(url, callback);
}, function (err, result) {
  console.log('final:');
  console.log(result);
});

mapLimit有四个参数:(urls, 5, function1, function2)
上面这段代码的意思是:遍历urls数组中的每个元素,执行function1(也就是function1会执行30次)。function1的第一个参数是urls数组中被遍历到的一个元素,第二个参数callback是当执行完成你的HTTP请求后回调通知async.js我已经执行完了,可以干别的事了。callback函数的参数是async.js规定的,第一个参数必须是err,用于出错时告诉async.js。
async.mapLimit函数的function2会在30个请求全部执行完成后,或者以上请求出错调用callback(err)时调用,function2的两个参数function (err, result)第一个数出错的错误,第二个是所有请求的结果。

关于Async.js可以参考我的一篇博客来学习:http://xxgblog.com/2015/12/22/nodejs-asy...


你任务执行完了 不是要通知你吗 那个callback就是通知 你要是自己再写个回调调用,那么还有必要用async库么

【热门文章】
【热门文章】