多窗口访问时请求阻塞
我按照范例,写了一个简单的httpServer来学习Node异步事件驱动的编程。代码如下
var http = require('http');
http.createServer(function(req,res){
console.log("req",req.url);
setTimeout(function(){
console.log("res",req.url);
res.writeHead(200,{"Content-Type":"text/plain"});
res.write("hello");
res.end();
},3000);
}).listen(3000);
当我浏览localhost:3000并反复刷新时,terminal显示
req / req / req / res / res / res /
与预期的相同
而当我通过
for(var i = 0;i<5;i++){
window.open("http://localhost:3000/");
}
在浏览器中打开多个窗口访问时,却变成了同步执行,最后一个窗口过了很久才返回。
这是什么原因呢?
4 回复
同步执行的效果是:第一个请求3秒后返回,第二个6秒后返回,第三个9秒……你说的最后一个窗口过了很久才返回是什么意思?其他请求呢?
是的,就是这样。修改后的真实代码是这样的:
var http = require('http');
http.createServer(function(req,res){
var start = new Date();
if(req.url === "/favicon.ico"){
return false;
}
console.log("req",req.url);
setTimeout(function(){
console.log("res",req.url,new Date() - start);
res.writeHead(200,{"Content-Type":"text/plain"});
res.write("hello");
res.end();
},3000);
}).listen(3000);
运行结果:
req /
res / 3005
req /
res / 3001
req /
res / 3002
req /
res / 3001
req /
res / 3001
直接在同一个窗口 Command + R 五次返回的就是
req /
req /
req /
req /
req /
res / 3003
res / 3000
res / 3001
res / 3003
res / 3001
系统环境是mac lion, node v0.6.11
@supersheep 既然有第二个说明没啥问题么,第一个是怎么“运行”出来的?
@jeffz chrome开五个窗口分别访问。刚才又拿safari测试了一下,一切正常。看来是chrome window.open时候的问题。