2013-01-13 3 views
1

서버 사용자가 2 초 후에 response.end()에 전화하지 않은 경우 408 응답을 보내는 net 모듈 (숙제)을 기반으로 약간의 동적 HTTP 서버를 작성했습니다.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이 비동기이기 때문에 콜백이 호출되지 않습니다. 이 "턴"이 끝나면 타이머가 활성화되고 턴이 끝나기 전에 타임 아웃을 해제합니다.

자바 스크립트의 이벤트 구동 아키텍처에 대해 먼저 읽어야합니다. This tutorisal이 좋은 시작일 것입니다. 이것은 타임 아웃 문제를 해결하는 데 필수적입니다.

+0

나는이 튜토리얼을 읽었지만 여전히 내 문제가 무엇인지 알 수 없다. 또한 clearTimeout 제거 시도하고 여전히 함수를 호출하지 않습니다 ... – Yotam

+1

긴 for 루프를 제거합니다 (쓸모가 없기 때문에 프로세스 종료 전에 콜백 함수를 실행하도록 setTimeout 시간을주지 않아야 함) 보류중인 시간 초과가 될 때까지 종료되지 않습니다.) clearTimeout()도 제거하십시오. 그것은 콜백 안에 들어갈 것이다. – molnarg

관련 문제