【问题标题】:Calling .on() before .emit() in event emitter -- is there a timing issue?在事件发射器中的 .emit() 之前调用 .on() - 是否存在时间问题?
【发布时间】:2014-11-23 08:53:32
【问题描述】:

以这段代码为例,其中f 是一个具有事件“主体”的流,它使用m 调用侦听器——它本身就是一个发射事件的流:

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。这一切都很简单,只是我的小脑袋有点危机(我不习惯处理流)。特别是:后端如何从fm 对象发出,以保证事件确实在正确的时间被调用?

具体来说:

  • 一般而言,必须如何编码f,以确保mm 在调用m.on('body', function(stream, info) { 之前不会发出?
  • 是否需要在发出事件之前使用 on() 添加侦听器 以便捕获它?
  • 如果是这样,这是否意味着fm 将在此处的代码注册之后发出事件?
  • 如果后端应该保证b.emit('end') 被调用 m.emit('end') 之后,那怎么可能真的发生,仍然保证on() 被调用before 发出任何事件?

好的,我对这件事感到 100% 的困惑。我显然错过了一些基本和关键的东西,因此我什至无法提出正确的问题......! (道歉)

【问题讨论】:

    标签: node.js events eventemitter


    【解决方案1】:

    在发出事件之前是否需要使用 on() 添加侦听器才能被捕获?

    是的。

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

    不,事件不会在任何地方排队。如果没有人在听他们的话,他们就会迷失方向。我认为这就是您要问的问题...fm 似乎不会在您的代码中发出事件。

    如果后端应该保证 b.emit('end') 在 m.emit('end') 之后被调用,那怎么可能真的发生,仍然保证 on() 在任何之前被调用发出其中一个事件?

    b 在您的示例中是一个字符串吗?我不确定你在这里问什么。

    换个角度想。当.on 被调用时,一个函数订阅了一个消息通道。在订阅该函数之前,这些消息已经在流动,如果取消订阅该函数,这些消息将继续流动。 .on.removeListener() 只是设置特定功能的订阅状态。

    即使没有人在监听它们,也可以发出事件。事件可以一直触发,如果没有人在听,它们就不会去任何地方。 (Node.js 中内置的错误事件是一个例外,如果没有错误处理程序,这些事件会变成真正的异常。)

    一般来说,如何对 f 进行编码,以确保 mm 在调用 m.on('body', function(stream, info) { 之前不会发出?

    我仍然没有具体遵循您的要求,因为您显示的代码都没有发出任何内容。但是,你不会真的想这样做。您需要在打开流之前设置事件处理程序,或者执行您正在执行的任何导致事件被触发的操作。

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

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

    【讨论】:

    • 谢谢布拉德!理解这一切......我添加了一个问题!我想我正在缩小我的困惑所在!问题:How would f have to be coded, in general terms, in order to make sure that mm doesn't emit till m.on('body', function(stream, info) { is called?(但请更新您的答案而不是在这里回答,我想接受您的回复作为答案!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2017-06-25
    • 2012-12-01
    相关资源
    最近更新 更多