由于streams在node.js中变得越来越流行,我试图深入了解它们。我查看了JSONStream和event-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){}
?
答案 0 :(得分:2)
在您提出的问题上并不完全清楚,但在这些情况下使用process.nextTick()
是允许模块的用户添加其'data'
等事件处理程序在创建流之后,之前发出任何事件。在您的示例中,stream.pipe
不是必需的,它只是用作客户端中的流的事件处理程序;这就是为什么它不在module.js
。
答案 1 :(得分:1)
这样做是为了避免在订阅者(您管道输入的可写Streams)订阅之前触发“数据”事件。这种对stream.resume
的调用会使您的数据“滚动”。顺便提一下,他们正在整理可读流位,使其更具有一丝直观性。您可能需要关注here。
编辑:顺便提一下,您应该知道对process.nextTick
的调用意味着该函数将在下一次通过节点的事件循环时被调用。这就是延迟执行(我同意具有欺骗性)的方法。