2016-08-09 2 views
1

비동기 함수를 사용하고자하는 nodeJS 프로젝트가 있습니다. 즉, Q 라이브러리를 사용하고 있습니다.Qchedferred로 오류 잡기

저는 someFunction()이라는 함수를 가지고 있는데, 약속을 되찾고 싶습니다. 당시 α- 함수로, 나는 그 약속이 해결되거나과 같이 거부되었는지 여부를 확인할 수 있습니다 : 나는 직관적으로 위에있는 기능을 기대

someFunction() 
    .then(
     function(results) { 
     console.log("Success!"); 
     }, 
     function (error) { 
     console.log("An error occurred, and I would wish to log it for example"); 
     } 
    ); 

오류 기능은 모든 가능한 오류를 잡을 것이다. 따라서 someFunction 내부에서 예외가 발생하면 오류 함수가 실행됩니다 ('then'다음의 두 번째 함수). 그러나 이것이 사실이 아닌 것처럼 보입니다.

예를 들어,이 된 SomeFuncion가 너무로 정의 될 것이다 가정 해 봅시다 :

function someFunction() { 
    var deferred = Q.defer(); 
    throw new Error("Can't bar."); 

    deferred.resolve("success"); 
} 

을 지금은 상위 코드 블록에서 수행과 같은 기능 된 SomeFuncion()를 호출하는 경우, 그것은 오류 기능이 실행되지 않습니다. 왜 그런가요? 오류를 잡으려고 약속의 일부가 Q.deferred가 아닌가? 발생하는 모든 오류를 수동으로 거부해야하는 이유는 무엇입니까? someFunction의 전체 내용을 try/catch 절에 설정 한 다음 지연을 거부 할 수 있다는 것을 알지만, 그렇게 잘못 생각합니다! 더 좋은 방법이 있어야하며, 여러분 중 일부는 그것을 알고 있습니다.

이 정보를 사용하여 deferred.reject 및 deferred.resolve가 사용되는 의미가 무엇인지 생각하기 시작했습니다. 그것은 심지어 예외를 잡기위한 것입니까? 난 그냥 모든 오류 케이스를 수동으로 통과해야하고, 그들에 deferred.reject를 호출? 이것이 어떻게 전문적으로 다루어 져야하는지 듣고 싶습니다. 예외 발생의

deferred.reject("error"); 

intead :

+1

이가) 어떤 약속을 돌려주는 기능을 넣지해야하는 이유를 정확히와 b)는 (HTTP [deferreds을 통해 약속 생성자를 선호한다] : 그것은 실행 프로그램 기능에서 동기 예외를 포착 할 수 있다는 이점이있다 : //stackoverflow.com/q/28687566/1048572) – Bergi

+0

하지만 약속하지 않은 함수가 throw되지 않는다는 것을 어떻게 보장 할 수 있습니까? 내 말은 당신이 외부 라이브러리를 사용할 수 있다는 말인가요?하지만 당신이 올바른 길을 가고 있다고 생각합니다. 아마도 대답을 줄 수있을 것입니다. –

+0

오류를 디버깅/제거하고 try..catch-block에 코드를 포함시키고 오류를 처리함으로써 래핑합니다. 어쩌면'Q.reject (error)'를 돌려 주면된다. – Thomas

답변

1

오류 기능이 실행되지 않습니다. 왜 그런가요?

약속을 반환하는 대신 동 기적으로 예외가 발생했기 때문입니다. Which you never should.

약속의 일부가 QdBferred가 오류를 catch하지 않습니까?

번호 thencatch 암시 적으로 자신의 콜백에 예외를 잡기는 defferreds는하지 않습니다 - 그들은 약속을 만들 단지 (deprecated) API이야.

발생하는 모든 오류를 수동으로 거부해야하는 이유는 무엇입니까?

어쨌든 비동기 오류는 던져지지 않고 콜백으로 전달 될 것으로 예상됩니다.

나는 someFunction의 전체 내용을 try/catch 절에 설정 한 다음 지연된 것을 거부 할 수 있음을 알고 있지만 잘못된 느낌이 들었다. 더 좋은 방법이 있어야합니다!

표준 크기 (ES6) 약속 작성 API 인 Q.Promise constructor이 있습니다.

function someFunction() { 
    return new Q.Promise(function(resolve) { 
    throw new Error("Can't bar."); 
    resolve("success"); 
    }); 
} 
2

Q 정도로 사용 성공 오류에 대한 특정 기능을 갖는다.

다음 것은 당신이 그것을 사용으로 된 SomeFuncion가 사용하는 약속을 반환해야한다는 것입니다 : 당신이 오류를 잡을하지 않는 한 실행의 코드를 중지합니다 (노드를 종료합니다) 오류를 던지는

function someFunction() { 

    var deferred = Q.defer(); 

    try{ 

    //some Asynchronous code 
    deferred.resolve("success"); 


    }catch(e){ 

    deferred.reject(e.message); 

    } 

    return deffered.promise; //return promise to use then 
} 
+0

예 알아요. 하지만 someFunction()에서 코드를 실행하면 오류가 발생합니다. 그렇다면 옵션은 try/catch 절 안에 someFunction 전체를 래핑하는 것일뿐입니다. someFunction 내부에서 예를 들어 오류가 발생할 수있는 일부 외부 라이브러리를 사용할 수 있습니다. –

0

try/catch 블록.

.catchdeferred.reject(error)을 사용하여 요청의 처리 오류를 전달할 수 있습니다. 코드 오류와 사용자 정의 throw 오류는 try/catch 내부에서 처리해야하며 이러한 오류를 처리하는 올바른 방법입니다.

function someFunction() { 
    var deferred = Q.defer(); 
    deferred.reject("Can't bar."); 
    // or 
    try { 
    throw new Error("Can't bar."); 
    } 
    catch(err) { 
    deferred.reject("Can't bar."); 
    } 

    deferred.resolve("success"); 
} 
2

약속은 마법이 아니기 때문에. 그들은 어떻게 든 마술처럼 오류를 잡지 않습니다. try..catch-blocks의 콜백에 대한 호출을 래핑하여 거부 된 약속으로 변환합니다.

Promise 체인에서 오류를 처리하려면 함수 호출을 약속 체인 : Q.resolve().then(someFunction).then(...)에 넣으십시오. someFunction에서 발생하는 모든 동기 오류는 다음에서 처리 할 수 ​​있습니다.

Btw : Q.defer()를 사용하고 일부 콜백 스타일의 API를 다루지 않는다면, 분명히 잘못하고있는 것입니다. Deferred-antipattern을 찾으십시오.

+0

이 컨텍스트에서 콜백 스타일 API의 의미를 자세히 설명해 주시겠습니까? 나는 비누 API를 다루고 있습니다. –