Node.js 应为stream.pipe,但已获得进程.nextTick(stream.resume)
随着node.js越来越流行,我正试图深入了解它们。我查看了流行模块的代码,如和,并通读了 还有一件事我不明白。我有时会看到以下模式: main.js:Node.js 应为stream.pipe,但已获得进程.nextTick(stream.resume),node.js,Node.js,随着node.js越来越流行,我正试图深入了解它们。我查看了流行模块的代码,如和,并通读了 还有一件事我不明白。我有时会看到以下模式: main.js: var module = require('./module') module('something').pipe(process.stdout) module.js: var Stream = require('stream') module.exports = function(string) { var stream = new
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
}
我认为这确实令人困惑,因为我会在module.js
中查找pipe
函数。在本例中,我必须查找这一行process.nextTick()
,然后找到调用的函数。作为初学者,您可能不知道process.nextTick()的功能,因此没有机会理解模块的功能
这种模式是编写流媒体模块的某种“最佳实践”吗?为什么不在
stream.pipe=function(dest){}
中实现逻辑?对于您提出的问题并不完全清楚,但是在这些情况下使用process.nextTick()
是为了允许模块的用户在创建流之后但在发出任何事件之前添加其'data'
等事件处理程序。在您的示例中,stream.pipe
不是必需的,它只是在客户端用作流的事件处理程序;这就是为什么module.js
中没有完全清楚您提出的问题,但是在这些情况下使用process.nextTick()
是为了允许模块用户在创建流之后但在发出任何事件之前添加其'data'
等事件处理程序。在您的示例中,stream.pipe
不是必需的,它只是在客户端用作流的事件处理程序;这就是为什么它不在module.js
中的原因。这样做是为了避免在订阅者(可写入的流)订阅之前触发“数据”事件。调用stream.resume
可以让你的数据“滚球”。顺便说一句,他们正在整理可读的流位,使其更直观一些。你可能想跟进
编辑:顺便说一句,您应该知道对
process.nextTick
的调用意味着该函数将在下一个传递节点的事件循环中被调用。这就是延迟执行(我同意这是欺骗性的)是如何完成的。这样做是为了避免在订阅者(可以写入的流)订阅之前触发“数据”事件。调用stream.resume
可以让你的数据“滚球”。顺便说一句,他们正在整理可读的流位,使其更直观一些。你可能想跟进
编辑:顺便说一句,您应该知道对
process.nextTick
的调用意味着该函数将在下一个传递节点的事件循环中被调用。这就是延迟执行(我同意这是骗人的)是如何完成的。+1;必须能够监听流中的数据
事件,而无需调用管道
+1;必须能够侦听流中的数据
事件,而无需调用管道
。