17 грудня 2021 р.

Асинхронні ітератори та генератори

Асинхронні ітератори дозволяють нам перебирати дані, які надходять асинхронно, на вимогу. Наприклад, коли ми завантажуємо щось частинами через мережу. А асинхронні генератори роблять це ще зручніше.

Давайте спочатку розглянемо простий приклад, щоб зрозуміти синтаксис, а потім розглянемо реальний варіант використання.

Пригадування ітераторів

Згадаймо тему про ітератори.

Ідея полягає в тому, що ми маємо об’єкт, наприклад, range:

let range = {
  from: 1,
  to: 5
};

…І ми хотіли б використовувати для нього цикл for..of, наприклад, for(value of range), щоб отримати значення від 1 до 5.

Інакше кажучи, ми хочемо додати до об’єкта можливість перебирання (ітерації).

Це можна реалізувати за допомогою спеціального методу з назвою Symbol.iterator:

  • Цей метод викликається конструкцією for..of, коли запускається цикл, і він повинен повернути об’єкт із методом next.
  • На кожній ітерації викликається метод next(), щоб отримати наступне значення.
  • next() має повертати значення у формі {done: true/false, value:<loop value>}, де done:true означає кінець циклу.

Ось реалізація об’єкта range, що перебирається: