Sepertinya saya tidak bisa membungkus kepala saya mengapa ini tidak berhasil.
Karena mainmengembalikan janji; semua asyncfungsi lakukan.
Di tingkat atas, Anda harus:
Gunakan asyncfungsi tingkat atas yang tidak pernah menolak (kecuali jika Anda ingin kesalahan "penolakan ditangani"), atau
Gunakan thendan catch, atau
(Segera hadir!) Gunakan level-atasawait , proposal yang telah mencapai Tahap 3 dalam proses yang memungkinkan penggunaan level-atas awaitdalam sebuah modul.
# 1 - asyncFungsi tingkat atas yang tidak pernah ditolak
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Perhatikan catch; Anda harus menangani penolakan janji / pengecualian async, karena tidak ada hal lain yang terjadi; Anda tidak memiliki penelepon untuk meneruskannya. Jika Anda mau, Anda bisa melakukan itu dengan memanggilnya melalui catchfungsi (bukan try/ catchsintaks):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... yang sedikit lebih ringkas (saya suka karena alasan itu).
Atau, tentu saja, jangan menangani kesalahan dan biarkan kesalahan "unhandled rejection".
# 2 - thendancatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
The catchhandler akan dipanggil jika terjadi kesalahan dalam rantai atau di Anda thenhandler. (Pastikan catchpawang Anda tidak melakukan kesalahan, karena tidak ada yang terdaftar untuk menanganinya.)
Atau keduanya argumen untuk then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Sekali lagi perhatikan kami mendaftarkan penangan penolakan. Tetapi dalam formulir ini, pastikan bahwa kedua thencallback Anda tidak melakukan kesalahan, tidak ada yang terdaftar untuk menanganinya.
Level 3 teratas awaitdalam modul
Kamu tidak bisa menggunakan await di tingkat atas skrip non-modul, tetapi proposal tingkat atasawait ( Tahap 3 ) memungkinkan Anda untuk menggunakannya di tingkat atas modul. Ini mirip dengan menggunakan asyncpembungkus fungsi tingkat atas (# 1 di atas) karena Anda tidak ingin kode tingkat atas Anda ditolak (melempar kesalahan) karena itu akan menghasilkan kesalahan penolakan yang tidak tertangani. Jadi, kecuali jika Anda ingin memiliki penolakan yang tidak ditangani ketika ada masalah, seperti dengan # 1, Anda ingin membungkus kode Anda dalam penangan kesalahan:
// 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
}
Perhatikan bahwa jika Anda melakukan ini, modul apa pun yang mengimpor dari modul Anda akan menunggu sampai janji Anda await selesai; ketika sebuah modul yang menggunakan tingkat atas awaitdievaluasi, pada dasarnya ia mengembalikan janji kepada pemuat modul (seperti halnya asyncfungsi), yang menunggu sampai janji itu diselesaikan sebelum mengevaluasi isi modul apa pun yang bergantung padanya.
awaittidak lain adalah gula untukthensintaksis janji .