MDN mengatakan for await...of
memiliki dua kasus penggunaan:
The
for await...of
pernyataan menciptakan loop iterasi async iterable objek serta pada iterables sync, ...
Saya sebelumnya mengetahui yang pertama: async iterables using Symbol.asyncIterator
. Tapi saya sekarang tertarik pada yang terakhir: iterables sinkron.
Kode berikut ini berulang di atas iterable sinkron - sebuah array janji. Tampaknya untuk memblokir proses pada pemenuhan setiap janji.
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)
Perilaku ini tampaknya sama dengan menunggu setiap janji pada gilirannya, sesuai dengan logika yang ditunjukkan di bawah ini. Apakah pernyataan ini benar?
Saya bertanya karena pola kode ini memiliki jebakan penolakan tersirat Promise.all
dan Promise.allSettled
menghindarinya, dan sepertinya aneh bagi saya bahwa pola ini akan didukung secara eksplisit oleh bahasa.
for await... of
dengan iterables sinkron, benar, dan jika demikian, apakah penting bahwa pola itu dapat memancarkan kesalahan penolakan yang tidak ditangani?