2014-09-29 3 views
1

Возьмите этот код, где f представляет собой поток, который имеет событие «тело», которое вызывает слушатель с m - что сам по себе является поток излучающих событий:Вызов .on() перед .emit() в эмитенте события - есть ли проблема с синхронизацией?

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. Затем код прослушивает события body и attributes. Все это прямолинейно, за исключением того, что мой маленький мозг переживает кризис (я не привык к потокам). Особенно: как происходит бэкэнд из объектов f и m, чтобы гарантировать, что события действительно вызывают в нужное время?

В частности:

  • Как f должны быть закодированы, в общих чертах, для того, чтобы убедиться, что m м не выделяет до m.on('body', function(stream, info) { называется?
  • Нужно ли добавлять слушателя с помощью() до Событие испускается, чтобы его можно было поймать?
  • Если да, то это означает, что f и m будут излучать события после код здесь прописал?
  • Если бэкенд должен гарантировать, что b.emit('end') называется после m.emit («конец»), как в том, что даже должно произойти на самом деле, по-прежнему гарантирует, что on() называется before любое из событий испускаются?

OK Я 100% смущен по этому вопросу. Я, очевидно, пропущу что-то основное и решающее, и я даже не могу задавать правильные вопросы из-за этого ...! (Извините).

ответ

2

Следует ли добавлять слушателя с помощью функции on() до того, как событие будет выпущено, чтобы оно было обнаружено?

Да.

Если да, означает ли это, что f и m будут излучать события после того, как зарегистрированный здесь код?

Нет, события нигде не ставятся в очередь. Если их не слушают, они будут потеряны. Я думаю, что это то, о чем вы просите ... f и m, похоже, не генерируют события в вашем коде.

Если бэкенд должен гарантировать, что b.emit («конец») вызывается после m.emit («конец»), как в том, что даже должно произойти на самом деле, по-прежнему гарантирует, что() является до того, как произойдет какое-либо одно из событий?

b - строка в вашем примере? Я не уверен, что вы спрашиваете здесь.

Подумайте об этом по-другому. Когда вызывается .on, функция подписывается на канал сообщений.Эти сообщения уже текут до того, как эта функция подписана, и будет продолжать работать, если эта функция не будет подписана. .on и .removeListener() просто установили статус подписки для определенной функции.

События могут излучаться, даже если их не слушают. События могут срабатывать все время, и если ничего не слушают, они просто не уходят. (Исключение является событие ошибок, встроенное в Node.js, которые превратились в настоящие исключения, если нет обработчика ошибок.)

Как бы е должны быть закодированы, в общих чертах, в чтобы удостовериться, что mm не излучает до m.on ('body', function (stream, info) {называется?

Я по-прежнему не придерживаюсь конкретно того, о чем вы спрашиваете, поскольку никто кода, который вы показываете, испускает что-либо. Но вы не хотели бы этого делать. Перед открытием потока необходимо настроить свои обработчики событий или делать то, что вы делаете, что приводит к увольнению событий.

Возможно, вы запутались в упорядочении обработки событий на новых объектах. В Node.js существует правило ... Никогда не испускайте непосредственно из своего конструктора. Всегда используйте nextTick() или аналогичный. Таким образом, после создания экземпляра любой код для присоединения к обработчикам событий может сделать это до того, как события будут испусканы.

Кроме того, если вы используете потоки, рассмотрите возможность использования события readable, чтобы поток оставался приостановленным, пока вы не будете готовы прочитать его. Потяните против толчка.

+0

Спасибо, Брэд! Понимая все это ... Я добавил вопрос! Я думаю, что я сужу, где мое замешательство! Вопрос: «Как будет кодироваться в общих чертах, чтобы удостовериться, что mm не испускается до тех пор, пока m.on ('body', function (stream, info) {не вызван?' (Но, пожалуйста, обновите свой ответ, а не ответьте здесь, я хочу принять ваш ответ в качестве ответа!) – Merc