为callback函数添加额外的参数

我正在Node.js中构build一个系统,该系统应该查找文件夹数组中的所有文件,统计它们,然后使用该信息做一些额外的工作。

我正在使用fs.readdir()从每个文件夹同步获取所有文件。 我的代码如下所示:

for(i=0,max=paths.length; i<max; i++) { var path = paths.pop(); console.log("READING PATH: " + path); fs.readdir(path, function(err, files) { handleDir(err, files, path); }); } 

问题是,取决于readdir()执行的速度,handleDir()得到错误的path。 发生这种情况的原因是,callback运行时,下一个循环已经开始 – 这意味着pathvariables已经改变。

所以,我需要做的是以某种方式将该pathvariableslocking为特定的callback函数。 我想不出有什么好办法做到这一点 – 任何人有一些想法?

没有块范围,所以使用范围函数。

 for(var i=0, path, max=paths.length; i<max; i++) { path = paths.pop(); console.log("READING PATH: " + path); handlePath( path ); } function handlePath ( path ) { fs.readdir(path, onPathRead); function onPathRead (err, files) { handleDir(err, files, path); } } 

这是JS对我来说更恼人的部分之一。 创build一个单独的函数(如@generalhenry演示的)的一种替代方法是将代码封装在pathvariables更改之前执行的匿名函数中。

 for(i=0,max=paths.length; i<max; i++) { var path = paths.pop(); console.log("READING PATH: " + path); fs.readdir(path, (function(p){ return function(err, files) { handleDir(err, files, p); }; })(path); ); } 

无论哪种方式,重要的一点是函数的上下文(匿名或不)是在pathvariables的值被重新分配之前启动的。

这实际上是Javascript的一个令人讨厌的特性,所以Coffeescript(这是一种编译成Javascript的语言)有一个特定的方式来处理它, do操作符。 在Coffeescript中,你原来的function是:

 for path in paths fs.readdir path, (err, files) -> handleDir(err, files, path) 

解决您的问题将是:

 for path in paths do (path) -> fs.readdir path, (err, files) -> handleDir(err, files, path) 

我正在寻找相同的东西,最终解决scheme,这是一个简单的例子,如果有人想要通过这个。

 var FA = function(data){ console.log("IN A:"+data) FC(data,"LastName"); }; var FC = function(data,d2){ console.log("IN C:"+data,d2) }; var FB = function(data){ console.log("IN B:"+data); FA(data) }; FB('FirstName')