Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';完成';在_flush完成之前在Node.js转换流上触发事件?_Javascript_Node.js_Stream_Streaming_Node.js Stream - Fatal编程技术网

Javascript 为什么';完成';在_flush完成之前在Node.js转换流上触发事件?

Javascript 为什么';完成';在_flush完成之前在Node.js转换流上触发事件?,javascript,node.js,stream,streaming,node.js-stream,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 (c

我希望“完成”回调只在回调一次时触发 传递给_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");
for finish表示只有当所有数据都已刷新到基础系统时才会触发该事件

查看,其目的似乎是仅当调用
\u flush
回调时才触发finish:

this.once('prefinish', function() {
  if (util.isFunction(this._flush))
    this._flush(function(er) {
      done(stream, er);
    });
else
   done(stream);
});
要么我错过了什么,要么这是节点的转换流的错误。我想是前者,但还没有发现我的问题。谢谢你的帮助

更新:请注意,如果像
sleep
模块提供的那样,将对
process.nextTick()
的调用替换为对
sleep
的同步调用,那么问题就会消失。该问题仅由节点v0.10中
\u flush

内的异步调用触发,因此更明显的是,这是预期的结果

然而,在master(v0.11.x)中,似乎发明了一个新的“prefinish”事件,并稍微改变了一些情况。但是,如果查看,您将看到调用prefinish()的是which。当prefinish()在发出“prefinish”后返回时,将发出“finish”。在执行此操作之前,它不会等待调用_flush()回调


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

对“finish”事件没有直接控制,并且“\u flush”不是可写流的一部分

使用PassThrough,并在“finish”事件之后执行“this.resume()”,您将得到一个“end”事件

或者,您可以按照pull请求进行操作:


或者使用模块:

谢谢!我将对0.11进行测试,然后考虑打开一个问题,因为当前的行为看起来与文档不匹配。我向Node提交了一个拉请求/错误报告。我们来看看会发生什么: