Nodejs Fstream管道多个文件时触发了多个“结束”回调

时间:2014-03-07 18:24:02

标签: javascript node.js stream

问题:我正试图找出一种方法,只有在将多个文件传递给fstream.Reader时才会触发一个'end'事件。

平台:节点0.6.21

有没有更好的方法来解决这个问题?

  var r = fstream.Reader({

    path: source, // source is a directory with two files.

    type: 'File'

  }).pipe(zlib.createGunzip()).pipe(tar.Extract({

    strip: strip,

    path: destination

  }));

  r.on('end', function() {
     // this is firing everytime a file is extracted. Ideally, I would only fire one 'end' event.
    if (typeof callback === 'function') {

      return callback(null);

    }

  });

提取两个文件时的结果=两个'结束'回调。任何建议表示赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用其他图书馆吗? Lodash#afterUnderscore#after会有所帮助。

您可以执行类似

的操作
// call `next` twice will call then call `callback`
var next = _.after(2, callback);

var r = fstream.Reader({
  path: source, // source is a directory with two files.
  type: 'File'
}).pipe(zlib.createGunzip()).pipe(tar.Extract({
  strip: strip,
  path: destination
}));

r.on('end', function() {
  next();
});

或者,使用async

function read(p, next) {
  var r = fstream.Reader({path: p}); // read code like above
  r.on('end', next);
}

var tasks = [
  read.bind(null, 'path/to/first/file'),
  read.bind(null, 'path/to/second/file')
];

// callback will be called after all files do `end` .. only once
async.parallel(tasks, callback);

答案 1 :(得分:0)

原来这是节点0.6的已知问题。如果您遇到此问题,则需要避免使用流或升级节点。