jwe*_*ner 5 javascript callback synchronous node.js
我正在Node.js中构建一个系统,它应该找到文件夹数组中的所有文件,对它们进行统计,然后使用该信息做一些额外的工作.
我正在使用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); });
}
Run Code Online (Sandbox Code Playgroud)
问题是,根据readdir()执行的速度,handleDir()获取错误的路径.发生这种情况是因为在回调运行时,下一个循环已经开始 - 意味着路径变量已经改变.
所以,我需要做的是以某种方式将路径变量锁定到它的特定回调函数.我想不出有什么好办法 - 任何人都有一些想法?
没有块范围,因此请使用范围函数.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说这是JS中比较讨厌的部分之一.创建单独函数(如@generalhenry演示)的另一种方法是将代码包装在路径变量更改之前执行的匿名函数中.
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);
);
}
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,重要的一点是函数的上下文(匿名或非匿名)是在重新分配路径变量的值之前启动的.