【发布时间】:2015-10-13 00:42:34
【问题描述】:
我有一些代码可以为dirs 数组中的每个源目录和目标目录复制包含在数组中的文件。通过循环的每次迭代,它都会调用复制的函数。它看起来像这样:
var filesInEachDir ["file1", "file2", "file3"];
var dirs = [
{"source": "sourceDirectory1", "dest":"destinationDirectory1"},
{"source": "sourceDirectory2", "dest":"destinationDirectory2"},
{"source": "sourceDirectory3" "dest":"destinationDirectory3"},
];
for (var i = 0; i < dirs.length; i++){
fs.mkdir(dirs[i], function(err){
if(err){
console.log(err);
}else{
copyFiles(dirs[i], filesInEachDir);
}
});
}
function copyFiles(dirs, files){
for (var c = 0; c < files.length; c++){
fs.copy(files[c], dirs.source, dirs.dest, {replace: false}, function(err){
if (err){
console.log(err);
}else{
console.log('file copied');
}
});
}
}
由于某种原因,只复制了dirs 的最后一个元素中的文件。如果我向dirs 添加另一个元素,它的文件将被复制,而不是其他任何文件。所以看起来i 在调用copyFiles 函数之前完全递增。为什么会这样?我怎样才能给copyFiles i 的每个递增值?
【问题讨论】:
-
什么是
fs.mkdir?它传递的函数参数是异步调用的吗?这会导致这个问题。 -
@IMTheNachoMan 是的,
mkdir是异步的。 -
@Paulpro 您标记为重复的帖子中建议的
forEach方法并没有解决我的问题。我不认为这是同一个问题。我认为它必须与mkdir的异步性质有关。你确定这是同一件事吗? -
是同一个东西,通常的原因是异步回调。一个 forEach 循环应该修复它:
dirs.forEach( function ( dir ) { fs.mkdir( dir, function ( ) { ... else{ copyFiles( dir, filesInEachDir ); } }); }); -
@thomas 我重新打开了它,但我建议重新阅读您的问题并确保您发布的内容在语法上正确并完全重现了您的错误。您对
fs.mkdir的呼叫似乎没有关闭,没有})。
标签: javascript node.js for-loop closures fs