десугаринг для ожидания .. из

Пытались выяснить, что именно 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() призывы.

Другие вопросы по тегам