我正在开发一个小节点项目,需要复制和解压缩各种大小的文件。我一直在尝试使用async.eachSeries来处理它,但它没有成功。这些文件已经创建,但是输出的文件最终写入多个不同的文件,无论它应该以哪个文件结束。
fs.readdir(path, function (err, files) {
async.eachSeries(files, function (file, callback) {
var wr = fs.createWriteStream(file);
fs.stat(file, function (err, stats) {
if (err) throw err;
var stream = fs.createReadStream(file).on('end', function () {
callback();
}).pipe(ungzip).pipe(wr);
});
}, function () {
//res.write(concatenated);
//res.end();
});
});
我还是节点新手,所以任何帮助都会受到赞赏。
-NQ
答案 0 :(得分:2)
看起来解决方案是使用闭包。
代码中的问题是传递给fs.stat的回调函数引用了外部作用域的变量,即wr,它在循环的下一次迭代中被更改。关闭是很好的解决方法。
fs.readdir(path, function (err, files) {
async.eachSeries(files, function (file, callback) {
var wr = fs.createWriteStream(file);
fs.stat(file, function(myWr){
return function (err, stats) {
if (err) throw err;
var stream = fs.createReadStream(file).on('end', function () {
callback();
}).pipe(ungzip).pipe(myWr);
}
}(wr));
}, function () {
//res.write(concatenated);
//res.end();}
});
});
有关闭包的详情,请参阅Please explain the use of JavaScript closures in loops和Serving A Batch Of Dynamic Pages。