javascript - 为什么 'finish' 事件会在 _flush 完成之前在 Node.js 转换流上触发?

标签 javascript node.js stream streaming node.js-stream

我希望“完成”回调仅在回调一次被触发 传递给 _flush 已完成,但它在 _flush 完成之前被触发。为什么?

var stream = require('stream').Transform();

// Nothing interesting here
stream._transform = function (chunk, enc, next) {
  next();
};

// _flush makes an async call.
stream._flush = function (callback) {
  console.log("Expecting 1st: Entering _flush ");

  return process.nextTick(function () {
    console.log("Expecting 2nd: Done with _flush");
    callback();
  });
};

stream.on('finish',function () {
  console.log("Expecting 3rd: Entering finish callback-- should be flushed now.");
});

stream.end("chunk");

node.js stream documentation for finish 表示只有当所有数据都已刷新到底层系统时才会触发该事件。

查看 source code for Node's Transform stream implementation看起来目的是仅在调用 _flush 回调时触发完成:

this.once('prefinish', function() {
  if (util.isFunction(this._flush))
    this._flush(function(er) {
      done(stream, er);
    });
else
   done(stream);
});

要么我错过了什么,要么这是 Node 的转换流的错误。我认为这是前者,但还没有发现我的问题。感谢您的帮助!

更新:请注意,如果我将对 process.nextTick() 的调用替换为对 sleep 的同步调用,因为 sleep 模块提供,然后问题就消失了。该问题仅由 _flush 中的异步调用触发。

最佳答案

在 Node v0.10 中,_flush() is called on 'finish' , 因此可以更明显地看出这是预期的结果。

然而,在 master (v0.11.x) 中,它看起来像是发明了一个新的“预完成”事件并稍微改变了一些事情。但是,如果您查看 the code ,你会看到 prefinish() 被称为 triggers _flush() .当 prefinish() 在发出 'prefinish' 后返回时,'finish' 就会被发出。在执行此操作之前,它不会等待 _flush() 回调被调用。

因此两个版本的结果行为相同。现在是否应该改变行为是一个单独的问题。您可以针对这种情况创建一个 github 问题,看看是否有兴趣修改行为。

关于javascript - 为什么 'finish' 事件会在 _flush 完成之前在 Node.js 转换流上触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620993/

相关文章:

python - 如何连续改变正弦声音的频率?

javascript - 为什么我在 ReactJs 中得到的表大小是其大小的 4 倍?

javascript - 如何使用 Sails.js 和 Waterline 更新 MongoDB 子文档中的特定键?

python - Flask View 的流式 shell 输出有效,但永远不会结束

javascript - 从 node.js 中的文件流中删除最后一个字符(fs 模块)

javascript - Node js Rest Service将数据保存到特定的对象json中

Twitter Stream api 按位置和轨迹过滤

javascript - 在asp.net中的一个页面中显示多个内容

javascript - ReactJS - 隐藏具有特定背景图像的 div

javascript - GraphQL Args 错误 : argument type must be Input Type but got: function GraphQLObjectType(config) {