2013-01-13 205 views
1

如果服务器用户在两秒钟后没有呼叫response.end(),我正在编写一个基于net模块(作业分配)的小动态HTTP服务器,该模块发送408响应。setTimeout在nodeJS中不起作用

无论我试过什么,函数都不会被调用。以下是一个演示是我的尝试在我的计划做另一代码:

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毫秒,接着一个很长的循环,但这种不工作。

为什么会发生这种情况?

+2

'for(var t = 0; t <100000000000; t ++){}' - 到底什么? – ThiefMaster

+0

在进程终止之前给setTimeout时间执行回调函数 – Yotam

+2

主动等待*总是*一个可怕的和错误的东西,除非你在一个你不是的微控制器上。 – ThiefMaster

回答

5

回调永远不会被调用,因为setTimeout是异步的。当“转弯”结束时,计时器将被激活,并且在转弯结束前清除超时。

您应该先阅读有关JavaScript的事件驱动架构。 This tutorisal将是一个好的开始。这对于解决您的超时问题至关重要。

+0

我看了教程,仍然不能说出我的问题是什么。另外,我尝试删除clearTimeout,它仍然不会调用该函数... – Yotam

+1

删除long for循环(因为它没用,您不必在程序终止前给setTimeout时间执行回调函数) ,它不会终止,直到您有暂停超时)并删除clearTimeout()以及。它会进入回调。 – molnarg