0

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

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

主.js:

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

模块.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
}

我认为这真的很令人困惑,因为我会pipemodule.js. 在示例中,我必须查找这一行process.nextTick(),然后找到被调用的函数。作为初学者,您可能不知道是做什么process.nextTick()的,因此没有机会了解该模块的作用。

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

4

2 回答 2

3

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

于 2012-10-09T01:58:24.967 回答
2

这样做是为了避免在订阅者(您输入的可写流)订阅之前触发“数据”事件。这种对stream.resume您的数据的“让球滚动”的调用。顺便说一句,他们正在整理 Readable Stream 位以使其更加直观。您可能想关注这里

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

于 2012-10-09T02:10:42.583 回答