为什么这个node.js代码阻塞?

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"十次完成.

我发现没有什么可以解释这种行为.

Aln*_*tak 5

当然,这是你覆盖第一个请求正在使用的变量gRescnt变量吗?

[ 编辑实际上,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.