2016-09-27 4 views
1

async 함수가 예외를 동 기적으로 throw하는 경우 어떻게됩니까?비동기 함수의 동기 예외

예 :

async function whatHappen() { 
    throw new BombError() 
    // no "await" here 
} 

try { 
    whatHappen().catch(() => console.error('rejected')) 
} catch (e) { 
    console.error('thrown') 
} 

내가 바벨에서이 예제를 실행했는데 throw가 자동으로 잡아서 거부 약속로 번역, 그래서 예를 콘솔에 "rejected"를 기록합니다 것 같다.

그러나 이것이 실제 사양과 JavaScript 엔진에서 구현되는 방법을 반영합니까? 나는 technical proposal을 읽으려고했지만, 스펙은 분명히 언어 사용자가 아니라 언어 구현자를 대상으로하고있다.

async 함수를 사용하여 에 항상을 반환하거나 약속을 동 기적으로 throw 할 수있는 상황이 있습니까? await없이 비동기 함수를 호출하면 try/catch 블록에 래핑되어야하는 시나리오가 있습니까?

답변

5

예, 비동기 함수는 항상 Promise를 반환합니다.

유사한 제안이 ES6 토론 중 이연 기능과되었다 : 당신이 링크 된 기술 제안에서

은, 그 진술 처음에 문장이있다. 이 제안은 유사하거나 동일한 구문을 사용하지만 발전기의 제어 흐름 구조와 직접적인 제어 흐름 구조를 직접 구축하는 동일한 사용 사례를 지원하며 사용자 지정 메커니즘을 정의하는 대신 반환 유형에 대한 약속을 사용하여 을 사용합니다.

(강조 광산)

그래서 당신이 동기 오류가 발생 할 수없는 등의 try/catch 블록에 비동기 기능을 포장 할 필요가없는 경우가 없다.

추신 : 그냥 Chrome Canary and MS Edge have implemented async/await behind a flag을 보았습니다. 따라서 시험해 볼 수도 있습니다.

+0

감사합니다. 비동기 함수 제안서에서 링크 된 지연 함수 strawman은 실제로 예외가 항상 거부 된 약속을 초래한다고 말함으로써이를 분명히합니다. 제안서의 언어 자체는 나에게 조금 모호했다. –