Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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
Node.js 应为stream.pipe,但已获得进程.nextTick(stream.resume)_Node.js - Fatal编程技术网

Node.js 应为stream.pipe,但已获得进程.nextTick(stream.resume)

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

随着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 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;必须能够侦听流中的
数据
事件,而无需调用
管道