Fen*_*der 2 javascript node.js
我试着用node.js玩一下并编写下面的代码(它没有意义,但这没关系):
var http = require("http"),
sys = require("sys");
sys.puts("Starting...");
var gRes = null;
var cnt = 0;
var srv = http.createServer(function(req, res){
res.writeHeader(200, {"Content-Type": "text/plain"});
gRes = res;
setTimeout(output,1000);
cnt = 0;
}).listen(81);
function output(){
gRes.write("Hello World!");
cnt++;
if(cnt < 10)
setTimeout(output,1000);
else
gRes.end();
}
Run Code Online (Sandbox Code Playgroud)
我知道其中有一些不好的东西(比如全局使用gRes),但我的问题是,为什么这段代码阻止第二个请求直到第一个完成?
如果我打开网址,它会开始写"Hello World"10次.但是如果我在第二个选项卡中同时打开它,则一个选项卡等待连接,直到另一个选项卡完成"Hello World"十次完成.
我发现没有什么可以解释这种行为.
当然,这是你覆盖第一个请求正在使用的变量gRes和cnt变量吗?
[ 编辑实际上,Chrome不会像Shadow Wizard所说的那样一次发送两个,但是代码原样严重破坏,因为每个新请求都会重置计数器,并且未完成的请求永远不会被关闭].
而不是使用全局,将输出函数包装为createServer回调中的闭包.然后它就可以随时访问局部res变量.
这段代码适合我:
var http = require("http"),
sys = require("sys");
sys.puts("Starting...");
var srv = http.createServer(function(req, res){
res.writeHeader(200, {"Content-Type": "text/plain"});
var cnt = 0;
var output = function() {
res.write("Hello World!\n");
if (++cnt < 10) {
setTimeout(output,1000);
} else {
res.end();
}
};
output();
}).listen(81);
Run Code Online (Sandbox Code Playgroud)
但请注意,在连接关闭之前,浏览器不会呈现任何内容,因为相关的标题会告诉它在下载时显示.我测试了以上使用telnet.