簡體   English   中英

在事件發射器中的.emit()之前調用.on()-是否存在計時問題?

[英]Calling .on() before .emit() in event emitter — is there a timing issue?

以下面的代碼為例,其中f是具有事件“ body”的流,它使用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是編碼,一般來講,為了確保m M不發光,直到m.on('body', function(stream, info) {叫?
  • 是否需要發出事件之前將on()與偵聽器一起添加才能使其被捕獲?
  • 如果是這樣,這是否意味着fm這里的代碼注冊之后發出事件?
  • 如果后端應該保證在b.emit('end') 之后調用b.emit('end'),那即使真的發生了,仍然要保證on() before任何一個事件發出了嗎?

好吧,我對此事100%感到困惑。 很明顯,我缺少一些基本且至關重要的東西,因此,我什至無法提出正確的問題……! (道歉)

是否需要在發出事件之前將on()與偵聽器一起添加才能使其被捕獲?

是。

如果是這樣,這是否意味着f和m將在這里的代碼注冊之后發出事件?

不,事件不會在任何地方排隊。 如果沒有人在聽他們,他們將會迷路。 我認為這仍然是您要問的... fm似乎未在您的代碼中發出事件。

如果后端應該保證在m.emit('end')之后調用b.emit('end'),那即使真的發生了,仍然要保證on()在任何一個事件發出了嗎?

b在您的示例中是字符串嗎? 我不確定您在這里問什么。

換個角度來看。 調用.on ,函數將預訂消息通道。 在訂閱該功能之前,這些消息已經在流動,如果取消訂閱該功能,這些消息將繼續流動。 .on.removeListener()只是為特定功能設置訂閱狀態。

即使沒有人在監聽事件,也可以發出事件。 事件可以一直觸發,如果什么也沒聽,它們就什么也沒有去。 (這是Node.js中內置的錯誤事件的一個例外,如果沒有錯誤處理程序,則會將其轉換為真正的例外。)

為了確保mm直到m.on('body',function(stream,info){被調用之前,mm才發射出去,一般來說,如何編碼f?

我仍然沒有特別關注您的要求,因為您顯示的代碼都不發出任何東西。 但是,您實際上並不想這樣做。 您需要在打開流之前設置事件處理程序,或執行任何操作導致事件被觸發。

您可能對新對象的事件處理順序感到困惑。 在Node.js中,有一條規則...永遠不要直接從構造函數中發出。 始終使用nextTick()或類似的東西。 這樣,在實例化之后,任何將自身附加到事件處理程序的代碼都可以在發出事件之前這樣做。

另外,如果您正在使用流,請考慮使用readable事件,以便在您准備好從中讀取之前,流保持暫停狀態。 拉與推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM