безнадежно ждать ... из - PullRequest
       0

безнадежно ждать ... из

0 голосов
/ 11 января 2020

Пытался выяснить, что именно делает 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 Ответ

1 голос
/ 13 января 2020

Метод итератора throw вообще не используется в протоколе итерации.

Метод итератора return вызывается, если код пользователя приводит к внезапному завершению, которое преждевременно завершает итерация (то есть до (await it.next()).done равна true):

  • , когда присваивание переменным итерации или телу l oop вызывает исключение
  • , когда l oop body оценивает оператор return, break или continue outer_label

Шаги процедуры AsyncIteratorClose действительно трудно точно представить как JS кода, поэтому я буду избегать попыток десагаржирования.

Шаги for await … of в точности соответствуют for … of l oop, за исключением доступа к итератору с помощью Symbol.asyncIterator Symbol.iterator и await возвращаемых значений вызовов .next() и .return().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...