2016-09-27 22 views
1

async関数が例外を同期的にスローするとどうなりますか?非同期関数の同期例外

例:

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関数に頼ることができます常には、約束を返したり、例外を同期的にスローする可能性がありますか? awaitなしで非同期関数を呼び出すと、try/catchブロックにラップされるシナリオはありますか?

答えて

5

はい、非同期関数は常にPromiseを返します。あなたがにリンクされている技術提案、文はその旨を初めに存在して

同様の提案がES6の議論の間に遅延機能で作られました。ここでの提案は、同様の構文を使用する同じユースケースをサポートしますが、ジェネレータの制御フロー構造と直接的に対照的なフロー構造を構築し、の約束を使用してカスタムメカニズムを定義する代わりにを使用します。

(重点鉱山)

だから、あなたはそれが同期エラーを投げることができないとして、try/catchブロックで非同期機能をラップする必要があることはありません。

PS:私はちょうどそれがChrome Canary and MS Edge have implemented async/await behind a flagを見たので、そこでもテストすることができます。

+0

ありがとうございました。非同期関数プロポーザルからリンクされた遅延関数のストローマンは、例外が常に拒否された約束をもたらすと言うことによって実際にこれを明確にします。提案の言語そのものは、私を孤立させて少し曖昧に感じました。 –