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
Верно ли мое описание с синхронными итерациями, и если да, то имеет ли значение, что этот шаблон может генерировать необработанные ошибки отклонения?Ответы:
Да, это странно, и вы не должны этого делать. Не повторяйте массивы обещаний, это в точности приводит к проблеме необработанных отклонений, о которой вы упоминали .
Так почему это поддерживается на языке? Для продолжения небрежно обещаю семантику.
Вы можете найти точное обоснование в этом комментарии к проблеме, обсуждающей эту часть предложения :
источник
unhandledrejection
события?window.addEventListener('unhandledrejection',...
Короче: это единственный пример, который я могу вспомнить, такого рода ошибки, генерируемые JavaScript. Однако я почти наверняка ошибаюсь, думая об этом. И наконец: имеет ли значение эта «ошибка» когда-либо, кроме нежелательного сообщения об ошибке в консоли?sad
Обещание не быть подawait
ред когда он терпит неудачу - что потребности кода , чтобы закончить ожидание ,happy
прежде чем он может начать ждатьsad
.sad
Обещание не удается , прежде чемhappy
решает. (Promise.all
инструмент лучше подходит для этого варианта использования)источник
Promise.all
это лучшее решение, почему язык учитывает этот синтаксис?for await...of
мог бы быть легко реализован для простого перечисления асинхронных итераций. Но они помогли перечислить синхронные итерации (но с (кажущимся?) Ловушкой). Почему?for await ... of
принимает синхронные итерации? Я хотел бы поддержать асинхронные генераторы, которые условно могут возвращать синхронные элементы.