MDN cho biết for await...of
có hai trường hợp sử dụng:
Câu
for await...of
lệnh tạo ra một vòng lặp lặp qua các đối tượng lặp không đồng bộ cũng như trên các vòng lặp đồng bộ hóa, ...
Trước đây tôi đã biết về cái trước: async iterables bằng cách sử dụng Symbol.asyncIterator
. Nhưng bây giờ tôi quan tâm đến cái sau: iterables đồng bộ.
Đoạn mã sau lặp lại qua một lần lặp đồng bộ - một mảng các lời hứa. Nó xuất hiện để chặn progess về việc thực hiện từng lời hứa.
async function asyncFunction() {
try {
const happy = new Promise((resolve)=>setTimeout(()=>resolve('happy'), 1000))
const sad = new Promise((_,reject)=>setTimeout(()=>reject('sad')))
const promises = [happy, sad]
for await(const item of promises) {
console.log(item)
}
} catch (err) {
console.log(`an error occurred:`, err)
}
}
asyncFunction() // "happy, an error occurred: sad" (printed in quick succession, after about 5 seconds)
Hành vi có vẻ giống như chờ đợi lần lượt từng lời hứa, theo logic được hiển thị bên dưới. Là khẳng định này là chính xác?
Tôi hỏi bởi vì mẫu mã này có một cạm bẫy từ chối ngầm ẩn Promise.all
và Promise.allSettled
tránh, và có vẻ lạ đối với tôi rằng mẫu này sẽ được ngôn ngữ hỗ trợ rõ ràng.
for await... of
với các lần lặp đồng bộ, chính xác, và nếu vậy, liệu mô hình đó có thể phát ra các lỗi từ chối không được xử lý không?