2016-11-10 1 views
0

올바르게 기억한다면 Promise.catch()를 사용하여 오류를 처리 할 수 ​​있도록 항상 약속이 throw되므로 오류가 발생합니다. 아무런 예외도 기억하지 못합니다. 그러나 내부에서 오류가 발생하면 setTimeout()이 작동하지 않습니다.약속 잡기 오류가 올바르게 발생하지 않습니다. NodeJS

왜 이것이 작동하지 않는지 설명 할 수 있습니까? 아니면 단순히 NodeJS의 버그입니까?

는 약속 함수의 실제 실행에 비동기 실행하기 때문에 당신은의 setTimeout에서 발생하는 오류를 잡지 못할 것

// This works! 
function async() { 
     return new Promise(function (resolve, reject) { 
       throw new Error('test'); 
     }); 
} 

async().catch(function() { 
     console.log('Ok: 1'); 
}); 


// This doesn't work.. 
function async_fail() { 
     return new Promise(function (resolve, reject) { 
       setTimeout(function() { 
         throw new Error('test'); 
       }, 1); 
     }); 
} 

async_fail().catch(function() { 
     console.log('Ok: 2'); 
}); 
+1

왜 당신이 약속을 내'setTimeout' 필요합니까 ... 당신이 경우 'BlueBird'를 사용하고 있습니다.'.delay'가 더 잘 작동하지 않아야합니까? http://bluebirdjs.com/docs/api/promise.delay.html –

+0

@DavidEspino 맞습니다.하지만 사용하는 npm 패키지 중 하나가'''setTimeout'''을 사용하면 어떻게 될까요? '''Promise.catch'''가 발생하지 않기 때문에 코드가 깨질 것입니다 :/나는 이것이 _ 발생했음을 알고 싶습니다. –

+0

그래서 ... 당신은'setTimeout'이 실행할 것을 제어하지 못합니까? 만약 당신이 내 생각에 그것이 그 문제 내에서의 약속을 '해결하는 것'또는 '거부하는 것'이라고 생각한다면 ... 맞습니까? http : //stackoverflow.com/questions/22707475/how-to-make-a-promise-from-settimeout ... 어쩌면 그게 도움이 될지 ... 대부분의'npm' 패키지는'콜백 '기반 ... 그래서 당신은'setTimeout'을 내부적으로 실행하는 패키지를 가지고 있다고 생각합니다 ... 95 %는'콜백 (callback) '옵션을 가질 수 있습니다 ... 그렇지 않다면 ... IMHO는 baaaad npm 패키지입니다 :) ... –

답변

0

테스트 코드. 따라서 약속 시간 자체가 이미 호출되었을 때 약속 자체가 이미 끝났습니다 (해결 또는 거부하라는 호출없이).

당신이 약속이의 setTimeout 내부 오류에 따라 실패 할 경우 수동으로 전화를 잡을 필요가있을 것이다는 거부 :

setTimeout(function() { 
    try{ 
      throw new Error('test'); 
    }catch(ex){ 
      reject(ex); 
    } 
}, 1); 
+0

또는 그는 약속 된 버전의'setTimeout'을 사용할 수 있습니다, 맞습니까? – Tom

+0

당신이 할 수 있겠지만, 약속 된'setTimeout'의 바닐라 js 버전을 모르므로, 사용중인 라이브러리/래퍼에 의존 할 수도 있습니다. 일반적으로 나는이 래퍼 중 하나를 setTimeout 내부의 오류를 catch하고 약속을 거부 할 것으로 기대합니다. – Tobi

관련 문제