Sepertinya saya tidak bisa membungkus kepala saya mengapa ini tidak berhasil.
Karena main
mengembalikan janji; semua async
fungsi lakukan.
Di tingkat atas, Anda harus:
Gunakan async
fungsi tingkat atas yang tidak pernah menolak (kecuali jika Anda ingin kesalahan "penolakan ditangani"), atau
Gunakan then
dan catch
, atau
(Segera hadir!) Gunakan level-atasawait
, proposal yang telah mencapai Tahap 3 dalam proses yang memungkinkan penggunaan level-atas await
dalam sebuah modul.
# 1 - async
Fungsi 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 catch
fungsi (bukan try
/ catch
sintaks):
(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 - then
dancatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
The catch
handler akan dipanggil jika terjadi kesalahan dalam rantai atau di Anda then
handler. (Pastikan catch
pawang 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 then
callback Anda tidak melakukan kesalahan, tidak ada yang terdaftar untuk menanganinya.
Level 3 teratas await
dalam 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 async
pembungkus 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 await
dievaluasi, pada dasarnya ia mengembalikan janji kepada pemuat modul (seperti halnya async
fungsi), yang menunggu sampai janji itu diselesaikan sebelum mengevaluasi isi modul apa pun yang bergantung padanya.
await
tidak lain adalah gula untukthen
sintaksis janji .