2013-05-10 2 views
1

저는 작업중인 프로젝트에서 Q 모듈을 사용하여 약속을 구현했습니다. 나는 static 메소드 Q.fncall()을 사용하여 node.js 스타일 함수 (emr, result를 반환하는 콜백을 기반으로 함)에서 약속을 생성합니다. 약속 시간 초과 후 실행 중지

문제

I는 일정 시간 후, 상기 기능의 실행을 정지 할 필요가있다, 그래서 Q 모듈의 기능 "타임 아웃"을 사용했다. 따라서 x 시간이 지나면 done 함수의 "error"콜백이 실행되고 타임 아웃을 처리하게되지만 처리기가 더 이상 수신하지 않아도 최종 콜백에 도달 할 때까지 함수 자체가 계속 실행됩니다.

질문 : 시간 초과가 실행 된 후 함수의 실행을 중지 할 수있는 방법이 있습니까? 타임 아웃 처리기에 변수를 설정하고 타임 아웃이 끝나면 함수를 계속 체크 할 수 있다는 것을 알았지 만, 이것을 달성하기위한 더 깨끗한 방법을 기대하고 있습니다.

 Q.nfcall(test1, id) 
     .timeout(1000) 
     .done(
      function (value) { 
       console.log("SUCCESS: " + value); 
      }, 
      function (reason) { 
       console.log("ERROR " + reason); 
      }, 
      function (progress) { 
       console.log("PROGRESS " + progress); 
      } 
     ); 

그리고 TEST1 기능 : 다음과 같이

코드는,의 setTimeout 내부의 코드를

function test1(id,callback){ 
db_rw_pool.query("SELECT * FROM table WHERE id=?",[id], function(err,result) { 
    if(err){ 
     callback(err,null); 
    } 
    else { 
     setTimeout(function(){ 
      console.log("I DON'T WANT YOU TO BRE PRINTED") 
      callback(null,result); 
     },2000); 

    } 
    return; 
}); 

} 내 이상적인 상황에서

(..., 2000) 결코 실행해서는 안됩니다. 이것이 가능한가? 사전에

감사합니다.

답변

4

나는 너 자신이 너무 낮은 수준이라고 생각한다. test1을 실행 한 후에는 db_rw_pool.query 메서드가 실행되는 것을 막을 방법이없고 (이 db_rw_pool.query 메서드에서 특별히주의하지 않는 한) 콜백이 호출되지 않습니다. SQL 쿼리에 대한 결과가 다시 나타납니다. 문제는 코드가 이러한 결과를 어느 시점에서 삼킬 지 여부입니다. 이 경우에 삼키는 것은 Q의 timeout 메소드의 코드에서 발생합니다. onFulfilled 핸들러에 실행하지 않으려는 코드는 done에두기 만하면됩니다.

당신은 문제가 나는 기능은 일정 시간이 지나면, 그래서 나는 Q 모듈의 기능을 "타임 아웃"을 사용했다의 ​​실행을 중지해야한다는 것입니다

물품.

휴면 방법의 실행에서이 기능을 멈출 것이다. 오히려, 약속 시간 (예 : Q.nfcall)이 설정된 기간 (이 경우 1000ms) 내에 충족되지 않으면 실패 할 것을 지시하는 새로운 약속을 반환합니다. 어떻게 든 실행에서 콜백을 중지하려면

, 당신은 시간을 확인하는 함수 내에서 그것을 포장 할 수있다. 같은 뭔가 : 약속과

function stopExecutingAfter(timeout, fn) { 
    var stopifAfter = Date.now() + timeout 
    return function() { 
    if(Date.now() > stopIfAfter) return 
    fn.apply(null, arguments) 
    } 
} 

Q 주로 문제 자체, 그것이 당신을 위해이 작업을 수행하지 않습니다 분명하므로. 이 기술을 사용하면 전달 된 함수를 보호하면서 약속을 반환하는 nfcallWithTimeout 함수를 만들 수 있습니다 (위와 같이 래핑하여). 그런 다음 시간 초과 동작을 두 번 구성 할 필요가 없습니다.

+0

어쨌든 훌륭한 답변을 주셔서 감사합니다. –