alsotang / node-lessons

:closed_book:《Node.js 包教不包会》 by alsotang
16.54k stars 4.7k forks source link

Lesson5 callback问题 #47

Open decadef20 opened 9 years ago

decadef20 commented 9 years ago

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_2 我是注释我是注释注释注释我是注释我是注释注释注释 callback(null, url + ' html content okkkkk'); }, delay); };

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

async.mapLimit(urls, 5, function(url, callback) { //callback_1 我是注释我是注释注释注释我是注释我是注释注释注释我是注释我是注释注释注释 fetchUrl(url, callback); }, function(err, result) { console.log('final:'); console.log(result); });

代码中我添加了两个注释 分别是callback_1和 callback_2 我看了官方的api mapLimit(arr, limit, iterator, [callback]) iterator 接受两个参数 iterator(item, callback) 到这里我都理解 为啥在注释callback_2处调用callback就直接可以输出啊 我连函数体都没有找到 callback一直都是以参数的形式传递的 到最后直接就输出了?难道是封装了吗?我看了async的源码 也没有看太明白? 希望能解答下 谢谢.

lijsh commented 8 years ago

我一开始看代码也不太懂,运行一次看输出结果就明白了。

EasonYou commented 8 years ago

我也是被这个问题困扰了好久。。。楼主知道是什么回事了吗

后面研究了下,这个callback应该是在调用mapLimit的时候,就已经是直接传入的了 你console.log下,发现就是个[Function] 具体的接口并不清楚(小白一个,说错了请原谅哈)