Javascript 为什么node.js代码会被阻塞?

Javascript 为什么node.js代码会被阻塞?,javascript,node.js,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/

我尝试使用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();
}
我知道其中有一些不好的地方,比如在全球范围内使用GRE,但我的问题是,为什么这段代码会阻止第二个请求,直到第一个请求完成

如果我打开url,它会开始写10次Hello World。但如果我在第二个选项卡中同时打开它,一个选项卡将等待连接,直到另一个选项卡完成十次Hello World的编写


我找不到任何东西可以解释这种行为。

肯定是您覆盖了第一个请求所使用的gRes和cnt变量吗

[事实上,正如影子向导所说,Chrome不会一次发送两个请求,但由于每个新请求都会重置计数器,未完成的请求将永远不会关闭,因此代码严重受损]

不要使用全局函数,而是将输出函数包装为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);
但是请注意,在连接关闭之前,浏览器不会呈现任何内容,因为告诉它在下载时显示的相关标题不存在。我使用telnet测试了上述内容。

我不熟悉node.js,但通常熟悉服务器端语言-当浏览器向服务器发送请求时,服务器会为该请求创建一个会话,并且会话生命期内来自同一浏览器的任何其他请求都会被视为同一会话


可能是出于设计考虑,出于充分的理由,来自同一会话的请求会依次处理-只有在服务器处理完一个请求后,它才会开始处理下一个请求。

尝试从两个不同的浏览器打开,可能服务器会一次处理一个来自同一会话的请求。hm奇怪。如果我从两个浏览器打开它,它会同时工作,但会覆盖第二个页面调用的gRes,但这没关系,我以前见过这个问题。但是为什么它不能在一个浏览器中使用两个选项卡呢?不知道为什么,因为我不熟悉node.js,但是,由于它被证明是正确的,所以将其作为答案发布很好的回答:比我的解决方案简单得多,因为我的解决方案并没有处理所有的案件,很高兴你们得到了真正的解决方案