MDN каже, for await...of
що два випадки використання:
for await...of
Оператор створює петлю ітерації асинхронної ітерації об'єктів, а також на ітеріруемих синхронізації, ...
Раніше я знав про колишнє: використання асинхронних ітерабелів Symbol.asyncIterator
. Але мене зараз цікавить останнє: синхронні ітерабелі.
Наступний код повторюється над синхронним ітерабельним - масивом обіцянок. Схоже, блокують пророків щодо виконання кожної обіцянки.
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
правильний мій опис синхронних ітерабелей, і якщо так, чи має значення цей шаблон, який може видавати необроблені помилки відхилення?