私は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 リクエストのイベントにハンドラーがアタッチされていることです。リクエストが作成された後、さらには送信 (予定) された後でもあります。さらに悪いことに、マニュアルには次のように書かれています。
このイベントがリッスンされていない場合、アップグレード ヘッダーを受信するクライアントの接続は閉じられます。
ハンドラーをアタッチする前に イベントが発生する可能性はありませんか? 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);
});