десугаринг для ожидания .. из
Пытались выяснить, что именно for await .. of
делает. Однако, даже прочитав спецификации, я не смог понять, что именно он делает.
Вот моя догадка:
const it = iterable[Synbol.asyncIterator]();
while (true) {
const { done, value } = await it.next();
if (done) return;
// User code...
}
Однако, если итератор реализует return
а также throw
Я не уверен, где и как они вступают в игру?
Одно предположение:
const it = iterable[Synbol.asyncIterator]();
try {
while (true) {
const { done, value } = await it.next();
if (done) return;
try {
// User code...
} catch (err) {
const { done } = await it.throw(err);
if (done) return;
}
}
} finally {
it.return();
}
1 ответ
В throw
метод итератора вообще не используется в протоколе итераций.
В return
метод итератора вызывается, если код пользователя оценивается как внезапное завершение, которое преждевременно завершает итерацию (т.е. до того, как (await it.next()).done
является true
):
- когда присвоение переменных итерации или тела цикла вызывает исключение
- когда тело цикла оценивает
return
,break
илиcontinue outer_label
заявление
Шаги процедуры AsyncIteratorClose действительно сложно точно представить в виде JS-кода, поэтому я не буду приводить попытки удаления сахара.
В for await … of
шаги в точности те из for … of
цикл, за исключением доступа к итератору с помощью Symbol.asyncIterator
вместо того Symbol.iterator
, а также await
в возвращаемых значениях .next()
а также .return()
призывы.