なぜこれが機能しないのか、頭を抱えているようには見えません。
main
約束を返すので; すべてのasync
関数が行います。
トップレベルでは、次のいずれかを行う必要があります。
async
拒否しないトップレベルの関数を使用する(「未処理の拒否」エラーが必要でない限り)、または
then
およびを使用するcatch
か、
(近日!)を使用するトップレベルawait
、ステージ3に達した提案プロセスのトップレベルの使用ができますawait
モジュールでは。
#1- async
決して拒否しないトップレベルの機能
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
に注意してくださいcatch
。他には何も行われないので、約束の拒否/非同期例外を処理する必要があります。それらを渡す呼び出し元はありません。必要に応じて、catch
(try
/ catch
構文ではなく)関数を介して呼び出した結果に対してそれを行うことができます。
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
...これはもう少し簡潔です(そのため、私は気に入っています)。
または、もちろん、エラーを処理せず、「未処理の拒否」エラーのみを許可します。
#2- then
とcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
catch
エラーがチェーンにしたりして発生した場合、ハンドラが呼び出されますthen
ハンドラ。(catch
それらを処理するために何も登録されていないため、ハンドラーがエラーをスローしないことを確認してください。)
または両方の引数then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
ここでも、拒否ハンドラを登録していることに注意してください。ただし、このフォームでは、then
コールバックのいずれもエラーをスローせず、それらを処理するために何も登録されていないことを確認してください。
#3 await
モジュールのトップレベル
await
モジュール以外のスクリプトのトップレベルでは使用できませんが、トップレベルのawait
提案(ステージ3)では、モジュールのトップレベルで使用できます。これは、トップレベルのasync
関数ラッパー(上記の#1)を使用するのと似ていますが、トップレベルのコードが拒否(エラーをスロー)しないようにすると、未処理の拒否エラーが発生します。したがって、#1の場合のように、問題が発生したときに未処理の拒否を行いたくない場合は、コードをエラーハンドラーでラップする必要があります。
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
これを行うと、モジュールからインポートするすべてのモジュールは、約束している問題await
が解決するまで待機します。トップレベルを使用するモジュールawait
が評価されると、基本的にはモジュールローダーにプロミスを返します(async
関数のように)。プロミスが確定するまで待機してから、それに依存するモジュールの本体を評価します。
await
promisethen
構文の砂糖にすぎません。