2017-10-09 5 views
0

Node.js에서 일부 HTTP 호출을 수행하고 요청이 실패했는지 여부를 검사하고 싶습니다. 오류로 인해 이 아니며은 반드시 "오류 조건"으로 간주되지만 원하는 것은 이를 기반으로 비즈니스 로직을 실행하십시오.체인의 초기에 어떻게 Promise를 해결할 수 있습니까?

let p = new Promise(function(resolve, reject) { 
    // In the real implementation this would make an HTTP request. 
    // The Promise resolution is either a response object or an Error passed to the `error` event. 
    // The error doesn't reject because the value I'm actually interested in getting is not the response, but whether the HTTP call succeeded or not. 
    Math.random() <= 0.5 ? resolve({ statusCode: 200 }) : resolve(new Error()); 
}); 

p.then(ret => { if (ret instanceof Error) return false; }) // This line should resolve the promise 
.then(/* Handle HTTP call success */); 

은 기본적으로 내가하고 싶은 말은 내가 오류 개체에 해결하는 경우 만 구제하고 false를 반환, "그렇지 않으면 (내가 그것을 단순화하기 때문에 분명히이 고안되어 있지만) 다음 코드 비슷한 있습니다. 응답 객체에 좀 더 많은 내용을 지정하고 true을 반환하거나 false을 반환 할 수 있습니다.

약속을 일찍 처리하고 나머지 체인을 실행하지 않으려면 어떻게해야합니까? 나는이 모든 잘못에 대해 생각하고 있는가? 나는 당신이 .then()으로 할 수있는 것과 같은 방식으로 AFAICT를 .catch() (이 약속은 결국 Promise.all으로 전달된다) 값을 얻을 수 없기 때문에 HTTP 호출 오류라면 거부하지 않을 것이지만 틀릴 수도있다.

나는 Bluebird, FWIW에 있으니 그로부터 여분의 것들을 자유롭게 사용하십시오. , 단지 그들을 돌려,

p.then(ret => { 
    if (ret instanceof Error) return false; // This line will resolve the promise 
    /* else handle HTTP call success, and return true/false or another promise for it */ 
}); 

답변

0

그냥 여기에 체인을 사용하지 않지만, 단 하나의 핸들러

를 반환하지 않음으로써 거부 된 가치 또는 캐치에서 던지면, 당신은 "실패로부터 회복"하고 계속 체인을 계속합니다.

이것이 최고의 구현 일 것입니다 유치;)