MDNによると for await...of
、2つのユースケースがあります。
この
for await...of
ステートメントは、非同期反復可能オブジェクトだけでなく、同期反復可能オブジェクトに対してもループするループを作成します...
私は以前に前者を知っていました:を使用しSymbol.asyncIterator
た非同期反復可能オブジェクト。しかし、今は後者に興味があります。同期イテラブルです。
次のコードは、同期イテラブル(promiseの配列)を反復処理します。それは、各約束の履行の進展を妨げるように見えます。
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
同期イテラブルを使用した私の説明は正しいですか?そうである場合、そのパターンが未処理の拒否エラーを出力する可能性があることは重要ですか?