LINUX.ORG.RU

История изменений

Исправление ChALkeR, (текущая версия) :

for await (const line of readLines(filePath)) {
  console.log(line);
}

Вот пример. Это, по сути, асинхронное перечисление.

Два момента:

  • Итерации идут асинхронно.
  • Они могут кончиться (когда закончится файл или поток). Причём этот флаг тоже, очевидно, прилетает асинхронно, вместе со значением.

Да, его можно реализовать через for () { await }, но тогда в каждой итерации надо будет получать не строчку, а каскад из строчки и флага останова/продолжения и проверять их ручками, делая break.

Генераторы, собственно, и нужны для этого — они на каждой итерации выдают такую пару, и сахар for-of спасает от проверки этого руками. Но этого сахара до for await не было для асинхронного перечисления.

В примере выше readLines — генератор, который выдаёт промисы.

Аналогичный вышеприведённому код у тебя выглядел бы так:

const stream = readLines(filePath);
for (;;) {
  const { value, done } = await stream.next();
  if (done) break;
  const line = value;
}

Ну и плюс сахар для самого определения генераторов, которые возвращают промисы.

Исходная версия ChALkeR, :

for await (const line of readLines(filePath)) {
  console.log(line);
}

Вот пример. Это, по сути, асинхронное перечисление.

Два момента:

  • Итерации идут асинхронно.
  • Они могут кончиться (когда закончится файл или поток). Причём этот флаг тоже, очевидно, прилетает асинхронно, вместе со значением.

Да, его можно реализовать через for () { await }, но тогда в каждой итерации надо будет получать не строчку, а каскад из строчки и флага останова/продолжения и проверять их ручками, делая break.

Генераторы, собственно, и нужны для этого — они на каждой итерации выдают такую пару, и сахар for-of спасает от проверки этого руками. Но этого сахара до for await не было для асинхронного перечисления.

C примером `for await` — readLines — генератор, который выдаёт промисы.

Аналогичный вышеприведённому код у тебя выглядел бы так:

const stream = readLines(filePath);
for (;;) {
  const { value, done } = await stream.next();
  if (done) break;
  const line = value;
}

Ну и плюс сахар для самого определения генераторов, которые возвращают промисы.