stream.pipe预期但得到process.nextTick(stream.resume)

时间:2012-10-08 21:05:18

标签: node.js

由于streams在node.js中变得越来越流行,我试图深入了解它们。我查看了JSONStreamevent-stream等热门模块的代码,并通读了stream-handbook

还有一件事我不明白。我有时会看到以下模式:

main.js:

var module = require('./module')
module('something').pipe(process.stdout)

module.js:

var Stream = require('stream')

module.exports = function(string) {
  var stream = new Stream()
  stream.readable = true

  stream.resume = function() {
    stream.emit('data', string)
    stream.emit('end')
  }

  process.nextTick(stream.resume)

  return stream
}

我认为这真的令人困惑,因为我会在pipe内寻找module.js函数。在示例中,我必须查找这一行process.nextTick(),然后找到被调用的函数。作为初学者,您可能不知道process.nextTick()的作用,因此无法理解该模块的作用。

这种模式是否是编写流模块的某种“最佳实践”?为什么不在stream.pipe = function(dest){}

中实现逻辑

2 个答案:

答案 0 :(得分:2)

在您提出的问题上并不完全清楚,但在这些情况下使用process.nextTick()是允许模块的用户添加其'data'等事件处理程序创建流之后,之前发出任何事件。在您的示例中,stream.pipe不是必需的,它只是用作客户端中的流的事件处理程序;这就是为什么它不在module.js

答案 1 :(得分:1)

这样做是为了避免在订阅者(您管道输入的可写Streams)订阅之前触发“数据”事件。这种对stream.resume的调用会使您的数据“滚动”。顺便提一下,他们正在整理可读流位,使其更具有一丝直观性。您可能需要关注here

编辑:顺便提一下,您应该知道对process.nextTick的调用意味着该函数将在下一次通过节点的事件循环时被调用。这就是延迟执行(我同意具有欺骗性)的方法。