为什么async.map函数与原生fs.stat函数一起工作?

async.map(['file1','file2','file3'], fs.stat, function(err, results){ // results is now an array of stats for each file }); 

根据文档 ,第二个参数是:

iterator(item,callback) – 应用于数组中每个项目的函数。

精细。

迭代器传递一个callback函数(err,transformed),一旦它完成了一个错误(可以是null)和一个转换后的项目,就必须调用它。

我认为fs.stat不符合这一点,我会说这不应该工作。

它应该是这样的:

 async.map(['file1','file2','file3'], function (file, complete) { fs.stat(file, function (err, stat) { complete(err, stat) }); }, function(err, results){ // results is now an array of stats for each file } ); 

fs.stat接受两个参数,第一个是文件,第二个是callback,由节点约定接受两个参数,错误和文件的统计信息:

 fs.stat(path, callback) 

这可以被看作是

 fs.stat(path, function(err, stats){ // ... }); 

这就是为什么它工作, fs.stat通过传递正是它所需要的。

更多信息: http : //nodejs.org/api/fs.html#fs_fs_stat_path_callback

http://nodejs.org/api/fs.html#fs_fs_stat_path_callback上的文档

fs.stat(path,callback)

asynchronousstat(2)。 callback得到两个参数(err,stats),其中stats是一个fs.Stats对象。 请参阅下面的fs.Stats部分了解更多信息。

由于fs.statcallback返回(err,stats),以下工作正常

 async.map(['file1','file2','file3'], fs.stat, function(err, results){ // results is now an array of stats for each file }); 

要自己做同样的传递一个适当的callback函数

 var async = require('async') var inspect = require('eyespect').inspector(); function custom(param, callback) { var result = 'foo result' var err = null callback(err, result) } var items = ['item1', 'item2'] async.map(items, custom, function (err, results) { inspect(results, 'results') })