在NodeJS中,setTimeout无法正常工作

3

我正在编写一个基于net模块的小型动态HTTP服务器(作业任务),如果服务器用户在两秒钟后没有调用response.end(),则会发送408响应。

无论我尝试什么,该函数都没有被调用。这里有另一段代码,演示了我在程序中尝试做的事情:

var NET = require("net"); 
var server = NET.createServer(function(socket){
    console.log("In connectionHandler");
    socket.on('data',function(data) {
        console.log("New data");
        var timer = setTimeout(function(end){
            console.log("INSIDE TIMEOUT FUNCTION");
            if (end) {
                return;
            }
            throw new ERROR.ServerError('408',' Request Timeout','The \
            server has timedouted');
            },10,true);
        for (var t = 0 ; t < 100000000000 ; t++){}
        clearTimeout(timer);
    })

});


server.listen(4000, function() {
    console.log("server bound");
});

所以,超时时间设置为10毫秒,然后是一个非常长的循环,但这并不起作用。为什么会出现这种情况?

3
for (var t = 0 ; t < 100000000000 ; t++){} - 这是什么鬼? - ThiefMaster
这是为了给setTimeout留出时间来执行回调函数,以免进程终止。 - Yotam
2
主动等待总是一件可怕和错误的事情,除非你在微控制器上,而你不是。 - ThiefMaster
1个回答

7
回调函数从未被调用,因为setTimeout是异步的。计时器将在此“轮次”结束时激活,您在轮次结束之前清除了超时。
您应该首先了解JavaScript的事件驱动架构。这个教程是一个很好的开始,这对于解决超时问题至关重要。

我已经阅读了教程,但仍然无法确定我的问题所在。此外,我尝试删除clearTimeout,但仍无法调用该函数... - Yotam
1
移除长时间的for循环(因为它是无用的,你不必“给setTimeout时间来执行回调函数,直到进程终止”,它不会终止,直到你有待处理的超时),同时也移除clearTimeout()。它将进入回调函数中。 - molnarg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接