为啥 async.map 函数可以与本机 fs.stat 函数一起使用?

Posted

技术标签:

【中文标题】为啥 async.map 函数可以与本机 fs.stat 函数一起使用?【英文标题】:Why async.map function works with the native fs.stat function?为什么 async.map 函数可以与本机 fs.stat 函数一起使用? 【发布时间】:2013-05-02 23:26:58 【问题描述】:
async.map(['file1','file2','file3'], fs.stat, function(err, results)
    // results is now an array of stats for each file
);

根据documentation,第二个参数是:

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

很好。

迭代器被传递了一个回调(错误,转换),它必须 一旦完成并出现错误(可以为空)和 一个变形的物品。

我认为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
    
);

【问题讨论】:

"Afaik fs.stat 不调用callback(err, stat)"你是什么意思?这正是您在代码中所做的。 @SLaks 我的意思是为什么传递 fs.stat 与 async.map 一起工作。我的示例是如何实现相同的行为。 那句话没有意义。您的代码完全符合您的要求。 他在问为什么第一个例子有效。在第二个中,他写下了他将如何编码(因为他对第一个有效的原因感到困惑)。 【参考方案1】:

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

fs.stat(路径,回调)

异步统计(2)。回调有两个参数(err,stats),其中 stats 是一个 fs.Stats 对象。有关详细信息,请参阅下面的 fs.Stats 部分。

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

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

你自己也要做同样的事情,传递一个带有适当回调的函数

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')
)

【讨论】:

【参考方案2】:

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

fs.stat(path, callback)

可以看作

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

这就是它起作用的原因,fs.stat 是通过传递它需要的内容来调用的。

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

【讨论】:

以上是关于为啥 async.map 函数可以与本机 fs.stat 函数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

async.map 或 async.each 与 async.parallel 有啥区别?

async.map 或 async.each 与 async.parallel 有啥区别?

async库中的async.map与bluebird的Promise.map有什么区别?

async.map 不会在 nodejs 中调用回调

为啥我本机可以ping通虚拟机,但虚拟机ping不通本机。本机是xp,虚拟机是2003。我用的网卡是nat。

为啥我vc中调用gethostname都返回-1,得到本机的主机名都会失败吗?