2017-05-04 19 views
3

저는 꽤 오랫동안 NodeJS 코드를 작성해 왔으며 사람들이 구현 한 다양한 기술을 보았습니다. 내 질문은 기상이 매개 변수 어설 션이 실패 할 때 서명이 Promise을 반환하고 직접 던지는 기능을 갖는 모범 사례로 간주됩니다.함수가 Promise를 반환 할 때 Javascript에서 매개 변수 어설 션을 직접 throw해야합니까?

우리는 이것을해야한다고 생각합니까? :

던져 동기화 방법

function asyncPromise(param) { 
    assert(param, 'Missing required parameter'); 
    // Param ok 
    return Promise.resolve(param); 
} 

또는이? :

거부 ​​약속

function rejectPromise(param) { 
    if (typeof param === 'undefined') { 
     return Promise.reject(new Error('Missing required parameter')); 
    } 
    // Param valid 
    return Promise.resolve(value); 
} 

내 직감이 함수가있다 그러나 경우, 계속 안 무언가로 고려되어야한다 직접 잘못된 매개 변수를 입력하기 때문에 던지는 첫 번째 방법을 가라고 말하고있다 Promise를 반환하는 서명의 경우 호출자는 .catch 오류 처리를 기대하며 직접 throw되는 경우 오류를 놓치게됩니다.

귀하의 의견은 무엇입니까?

+0

의견을 말하기는이 사이트의 범위를 벗어납니다. https://stackoverflow.com/help/on-topic – Purefan

+0

나는 '실행'을 사용하지만 실행 프로그램에서는 사용합니다. 이것은'.reject'와 동일하지만 더 명백합니다. – georg

+1

@ Purefan 아마도 의견을 묻는 것이 적절한 정의가 아니었을 것입니다 ... 아마도 가장 좋은 방법이 무엇인지 물을 것이라고 말할 수 있습니다. (있는 경우) – mitsos1os

답변

-1

아마도 문제는 비동기식 약속에 대해 물어 보는 것이지만 동기식 코드 예제를 사용하는 것입니다. 오류가 발생할 수 두 장소가이 코드에서

/** 
* @return Promise Resolved when a value is accepted, rejected otherwise. 
* @throw AssertionException When no parameter is given. 
*/ 
function asyncPromise(param) { 
    assert(param, 'Missing required parameter'); 

    var promise = new Promise(param); 
    something.process(promise); //start asynchronous process 

    return Promise; 
} 

//somewhere else while processing 
try { 
    doSomething(); 
} catch (Exception err) { 
    promise.reject(err); 
} 

//somewhere else after processing is done 
if (success) { 
    promise.resolve(result); 
} 
else { 
    promise.reject(error); 
} 

:

올바른 관련 코드는 다음과 같이 보일 것이다 A) 동기 오류가 발생하고 안전하게 던지는 처리 할 수있는 asyncPromise()에서 Exception 및 B) Exception을 던지면 처리가 중지되지만 원래 함수에 응답을 반환하지 않는 처리 으로 고정됩니다. 이 경우 예외를 throw하는 대신 약속을 거부해야합니다.

약속을 거부하거나 예외를 throw하여 사례 A)를 해결하는 것은 문제의 원인에 따라 달라집니다. 문제로 인해 약속을 만들거나 처리 할 수없는 경우 예외를 돌려 주어야한다. 다른 한편으로는 안전하게 약속을 만들 수 있지만 처리를 시작하려고 할 때 문제가 발생하면 약속을 거부해야합니다. 약속을 거부해야하는 또 다른 이유는 프로세스를 시작할 이유가 없다는 것을 깨닫는 경우입니다 (예 : 이미 시도했거나 실패한 경우).


또한 함수가 명확하게 약속을 반환하지만 매개 변수가 정의되지 않은 경우 예외을 던질 수 있다고하는 것이 참고. 그런 식으로 모두는을 어떻게 기대하는지 알고 있습니다.