なぜこれが機能しないのか、頭を抱えているようには見えません。
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関数のように)。プロミスが確定するまで待機してから、それに依存するモジュールの本体を評価します。
awaitpromisethen構文の砂糖にすぎません。