MDN กล่าวว่า for await...of
มีสองกรณีใช้งาน:
for await...of
งบสร้างวงวนมากกว่า async iterable วัตถุเช่นเดียวกับ iterables ซิงค์, ...
ผมก็ตระหนักก่อนหน้านี้ของอดีต: async iterables Symbol.asyncIterator
ใช้ แต่ตอนนี้ฉันสนใจตอนหลัง: สามารถซิงโครไนซ์ได้
รหัสต่อไปนี้ซ้ำผ่าน iterable ซิงโครนัส - อาร์เรย์ของคำสัญญา ดูเหมือนว่าจะปิดกั้นความสำเร็จในการปฏิบัติตามสัญญาแต่ละข้อ
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)
พฤติกรรมดูเหมือนจะคล้ายกับการรอคอยสัญญาในทางกลับกันตามตรรกะที่แสดงด้านล่าง การยืนยันนี้ถูกต้องหรือไม่
ฉันถามเพราะรูปแบบของรหัสนี้มีข้อผิดพลาดในการปฏิเสธการดักฟังPromise.all
และPromise.allSettled
หลีกเลี่ยงและดูเหมือนว่าแปลกสำหรับฉันที่รูปแบบนี้จะได้รับการสนับสนุนอย่างชัดเจนจากภาษา
for await... of
กับการทำซ้ำแบบซิงโครนัสถูกต้องและถ้าเป็นเช่นนั้นมันเป็นเรื่องสำคัญไหมที่รูปแบบนั้นสามารถปล่อยข้อผิดพลาดการปฏิเสธที่ไม่ได้จัดการได้หรือไม่?