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ì maintrả lại một lời hứa; tất cả các asyncchức năng làm.
Ở cấp cao nhất, bạn phải:
Sử dụng asyncchứ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 thenvà 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 awaittrong một mô-đun.
# 1 - asyncChứ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 catchhàm (chứ không phải try/ catchcú 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 - thenvàcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Trình catchxử lý sẽ được gọi nếu xảy ra lỗi trong chuỗi hoặc trong thentrình xử lý của bạn . (Hãy chắc chắn rằng catchtrì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 thencuộ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 awaittrong 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 asynctrì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 awaitgiả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 asyncchứ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ó.
awaitkhông có gì ngoài đường chothencú pháp lời hứa .