Tôi dường như không thể quấn đầu xung quanh tại sao điều này không hoạt động.
Bởi vì main
trả lại một lời hứa; tất cả các async
chức năng làm.
Ở cấp cao nhất, bạn phải:
Sử dụng async
chức năng cấp cao nhất không bao giờ từ chối (trừ khi bạn muốn các lỗi "từ chối chưa xử lý") hoặc
Sử dụng then
và catch
, hoặc
(Sắp có!) Sử dụng cấp cao nhấtawait
, một đề xuất đã đạt đến Giai đoạn 3 trong quy trình cho phép sử dụng cấp cao nhất await
trong một mô-đun.
# 1 - async
Chức năng cấp cao nhất không bao giờ từ chối
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Lưu ý catch
; bạn phải xử lý các trường hợp ngoại lệ từ chối / không đồng bộ, vì không có gì khác xảy ra; bạn không có người gọi để chuyển chúng đến. Nếu bạn thích, bạn có thể làm điều đó với kết quả của việc gọi nó thông qua catch
hàm (chứ không phải try
/ catch
cú pháp):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... Đó là một chút ngắn gọn hơn (tôi thích nó vì lý do đó).
Hoặc, tất nhiên, không xử lý lỗi và chỉ cho phép lỗi "từ chối không xử lý".
# 2 - then
vàcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Trình catch
xử lý sẽ được gọi nếu xảy ra lỗi trong chuỗi hoặc trong then
trình xử lý của bạn . (Hãy chắc chắn rằng catch
trình xử lý của bạn không ném lỗi, vì không có gì được đăng ký để xử lý chúng.)
Hoặc cả hai đối số để then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Một lần nữa thông báo chúng tôi đang đăng ký một trình xử lý từ chối. Nhưng trong hình thức này, hãy chắc chắn rằng cả hai then
cuộc gọi lại của bạn không gây ra bất kỳ lỗi nào, không có gì được đăng ký để xử lý chúng.
# 3 cấp cao nhất await
trong một mô-đun
Bạn không thể sử dụng await
ở cấp cao nhất của tập lệnh không phải mô-đun, nhưng đề xuất cấp cao nhấtawait
( Giai đoạn 3 ) cho phép bạn sử dụng nó ở cấp cao nhất của mô-đun. Nó tương tự như sử dụng async
trình bao bọc hàm cấp cao nhất (số 1 ở trên) ở chỗ bạn không muốn mã cấp cao nhất của mình từ chối (ném lỗi) vì điều đó sẽ dẫn đến lỗi từ chối không được xử lý. Vì vậy, trừ khi bạn muốn có sự từ chối chưa được xử lý đó khi có sự cố xảy ra, như với # 1, bạn muốn bọc mã của mình trong một trình xử lý lỗi:
// 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
}
Lưu ý rằng nếu bạn thực hiện việc này, mọi mô-đun nhập từ mô-đun của bạn sẽ đợi cho đến khi lời hứa bạn await
giải quyết; khi một mô-đun sử dụng mức cao nhất await
được đánh giá, về cơ bản nó sẽ trả lại một lời hứa cho trình tải mô-đun (giống như một async
chức năng), chờ cho đến khi lời hứa đó được giải quyết trước khi đánh giá các phần của bất kỳ mô-đun nào phụ thuộc vào nó.
await
không có gì ngoài đường chothen
cú pháp lời hứa .