node.js -своевременное подключение обработчиков событий

Я изучаю node.js и наткнулся на этот пример в руководстве по node.js:

...
var req = http.request(options);
req.end();

req.on('upgrade', function(res, socket, upgradeHead) {
  console.log('got upgraded!');
  socket.end();
  process.exit(0);
});
...

В этом примере я вижу, что обработчик прикреплен к событию HTTP-запроса, после создается запрос и даже после того, как (запланирована его )отправка . Что еще хуже, в руководствах говорится:

If this event isn't being listened for, clients receiving an upgrade header will have their connections closed.

Не может ли событие произойти доreq.on(...был шанс прикрепить обработчик? Подозреваю, что я чего-то не понимаю в асинхронной модели узла. Или этот код из руководства по узлу разработан в расчете на то, что сетевой запрос займет больше времени, чем выполнение следующей строки кода?!

Другой пример:

http.get("http://www.google.com/index.html", function(res) {
  console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

Здесь HTTP-запрос будет инициирован сразу после создания объекта, и только после этого мы прикрепляем обработчик ошибок. Опять же, (1 )это код, который работает только из-за сетевые задержки, (2 )Я ничего не понимаю в концепциях node.js, или (2b )событие будет "ждать", пока я не прикреплю к нему обработчик?

РЕДАКТИРОВАТЬ: Еще лучший пример, тоже из мануала. Хороший и Плохой примеры ниже отличаются только тем, что в хорошем случае мы присоединяем событие достаточно быстро и, таким образом, мало шансов пропустить данные, или это никогда нельзя пропустить данные таким образом (и почему ?!)

// Good
request.on('response', function (response) {
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

// Bad - misses all or part of the body
request.on('response', function (response) {
  setTimeout(function () {
    response.on('data', function (chunk) {
      console.log('BODY: ' + chunk);
    });
  }, 10);
});
7
задан Sandman4 23 July 2012 в 14:26
поделиться