Возьмите этот код, где 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
. Затем код прослушивает события body
и attributes
. Все просто, за исключением того, что мой маленький мозг находится в некотором кризисе (я не привык иметь дело с потоками). В частности: как бэкенд излучает объекты f
и m
, чтобы гарантировать, что события действительно вызываются в нужное время?
Конкретно:
- Как должен быть закодирован
f
в общих чертах, чтобы гарантировать, чтоm
m не будет излучать до тех пор, пока не будет вызванm.on('body', function(stream, info) {
? - Нужно ли добавлять прослушиватель с помощью on() до события, чтобы его можно было перехватить?
- Если да, значит ли это, что
f
иm
будут генерировать события после регистрации кода здесь? - Если предполагается, что серверная часть гарантирует, что
b.emit('end')
вызывается после m.emit('end'), как это вообще должно произойти на самом деле, по-прежнему гарантируя, чтоon()
вызываетсяbefore
любое из событий излучается?
ОК, я на 100% запутался в этом вопросе. Я явно упускаю что-то основное и важное, и из-за этого я даже не могу задать правильные вопросы...! (Извинения)