【问题标题】:Node Stream - Make sync to return array when stream is done.节点流 - 当流完成时进行同步以返回数组。
【发布时间】:2015-02-28 09:56:31
【问题描述】:

我编写了这个函数来从流中提取文件列表。它可以工作,但是流是异步的,并且在流完成之前返回 files 数组。我真的不想使用 Promise 库......尽量保持代码简洁。流完成后如何返回files 数组?

function fileList(source) {
    var files = [];
    source.pipe(through2.obj(function(obj, enc, next) {
        file = obj.history[0].split("/").pop();
        files.push(file);
        next();
    }));

    return files;
}

【问题讨论】:

  • 您不能使异步操作同步。只是不能在 JS 中完成。使用回调或承诺或类似的东西进行异步设计以返回值。

标签: node.js stream


【解决方案1】:

提供回调而不是从函数返回值:

function fileList(source, callback) {
  var files = [];
  source.pipe(through2.obj(function(obj, enc, next) {
    file = obj.history[0].split("/").pop();
    files.push(file);
    next();
  }, function(flushcb) {
    flushcb();
    callback(null, files);
  }));
}

// ...

fileList(stream, function(err, files) {
  if (err) throw err;

  // use `files` here ...
});

【讨论】:

  • 快速提问,flushcb() 在这里做什么,它在哪里定义?
  • 该功能与streams2中的_flush()相同。表示流的end()已经被调用。
  • 我应该澄清一下:我的意思是第二个函数是 _flush() 等价的。对flushcb() 的实际调用只是让节点知道您已完成刷新我们可能出于任何原因在内部缓冲的任何数据(在这种情况下,我们没有此类数据,因此我们只需立即调用回调)。
猜你喜欢
  • 2019-08-26
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2018-05-19
  • 2013-07-11
  • 1970-01-01
相关资源
最近更新 更多