我正在研究 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);
});