1

我正在开发一个小型节点项目,该项目需要复制和解压缩许多不同大小的文件。我一直在尝试使用 async.eachSeries 来处理它,但它没有成功。创建了文件,但输出 wr 的管道最终会写入多个不同的文件,而不管它最终应该在哪个文件中。

     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

4

1 回答 1

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();}
   });
});

有关闭包的更多信息,请参阅请解释在循环中使用 JavaScript 闭包提供一批动态页面

于 2013-09-13T02:15:28.830 回答