调用事件发射器中的.emit()之前调用.on()是否存在计时问题?

取这个代码,其中f是一个具有事件“body”的stream,它使用m来调用监听器 – 这本身就是一个stream事件:

 f.on('message', function(m) { m.on('body', function(stream, info) { var b = ''; stream.on('data', function(d) { b += d; }); stream.on('end', function() { if (/^header/i.test(info.which)) msg.header = Imap.parseHeader(b); else msg.body = b; }); }); m.on('attributes', function(attrs) { msg.attrs = attrs; msg.contentType = partID[1]; }); }); f.on('end', function() { if (hadErr) return; cb(undefined, msg); }); 

后端发出一个“消息”事件,传递一个m对象。 代码然后监听事件bodyattributes 。 这一切都很简单,只是我的小脑袋处于危机之中(我不习惯处理stream)。 特别是:如何从fm对象发出后端,以确保事件在正确的时间被调用?

特别:

  • 一般来说,为了确保m m不会发射到m.on('body', function(stream, info) {被调用?
  • 在发送事件之前是否需要将侦听器添加到on()中才能被捕获?
  • 如果是这样,这是否意味着fm这里的代码注册发出事件?
  • 如果后端应该保证在b.emit('end') 之后调用b.emit('end'),那么这个过程如何真的发生,仍然保证on() before任何一个事件发射?

好的,我对此事百分百困惑。 我明显错过了一些基本的和关键的东西,我甚至不能因为这个问题而提出正确的问题。 (道歉)

在发送事件之前是否需要将侦听器添加到on()中才能被捕获?

是。

如果是这样,这是否意味着f和m会在这里的代码注册后发出事件?

不,事件不在任何地方排队。 如果没有人在听他们,他们将会失去。 我想这就是你要问的东西… fm似乎不会在你的代码中发射事件。

如果后端应该保证在m.emit('end')之后调用b.emit('end'),那么这个过程如何真的发生,仍然保证on()在任何一个事件发射?

b是你的例子中的一个string? 我不确定你在这里问什么。

想想它的不同。 当.on被调用时,一个函数被订阅了一个消息通道。 这些消息在订阅之前就已经stream动了,如果这个function没有订阅的话,这些消息将继续stream动。 .on.removeListener()只是设置特定function的订阅状态。

事件可以被发射,即使没有人在听他们。 事件可以随时开始,如果没有人在听,他们就不会去任何地方。 (一个例外是Node.js中的错误事件,如果没有error handling程序,它会变成真正的exception。)

一般来说,为了确保mm不会发出直到m.on('body',function(stream,info){被调用?

我仍然没有特别关注你所问的问题,因为你所展示的代码都没有发出任何东西。 但是,你真的不想这样做。 您需要在打开stream之前设置您的事件处理程序,或者执行您正在执行的任何操作,从而导致事件被触发。

您可能会对新对象的事件处理顺序感到困惑。 在Node.js中,有一个规则…永远不要从你的构造函数直接发射。 总是使用nextTick()或类似的。 这样,在实例化之后,任何将其自身附加到事件处理程序的代码都可以在事件发出之前执行。

另外,如果您正在使用stream,请考虑使用readable事件,以使stream保持暂停状态,直到您准备好读取stream。 拉与推。