Еще одна полезная функция, которая достигла стадии 4 процесса предложения TC39, - это асинхронная итерация. С помощью асинхронных итераторов у нас есть синтаксическая поддержка асинхронной итерации с использованием протоколов AsyncIterable и AsyncIterator.

Асинхронные итераторы похожи на обычные итераторы, за исключением того, что их метод next () возвращает обещание для пары {value, done}. Чтобы использовать асинхронные итерации, теперь мы можем использовать ключевое слово await с циклами for… of.

Давайте посмотрим на пример цикла:

async function example() {
   // Regular iterator
   for (const item of NumberIterator) {
      // …
   }
   // Async iterator
   for await (const item of AsyncNumberIterator) {
      // …
   }
}

Давайте посмотрим на другой пример использования обещания:

async function asyncLoopSample() {
   const arrayOfPromises = [
      fetch('file1.txt'),
      fetch('file2.txt'),
      fetch('file3.txt'),
      fetch('file4.txt')
   ];
   // Normal iterator
   for (const item of arrayOfPromises) {
      console.log(item); // Logs a promise
   }
   // Async iterator
   for await (const item of arrayOfPromises) {
      console.log(item); // Logs a resolved response
   }
}

В приведенном выше примере for-await берет каждый элемент из массива и ожидает его разрешения. Вы получите первый ответ, даже если другие ответы еще не готовы, но вы всегда будете получать ответы в правильном порядке.

Хорошо, а вы помните генераторы? Взгляните сюда:



Теперь давайте создадим асинхронный генератор:

import axios from 'axios';
// Note the * after "function"
async function* asyncRandomDogs() {
   // This is a web service that returns a random dog image
   const url = 'https://dog.ceo/api/breeds/image/random';
   while (true) {
      const response = await axios.get(url);
      yield await response.data.message;
  }
}
async function getRamdonDog() {
   for await (const dog of asyncRandomDogs()) {
      console.log(dog);
      if (dog.indexOf('japanese') > 0) break;
   }
}
getRamdonDog();

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

Это все, ребята,

Спасибо за чтение!