Асинхронні ітератори дозволяють нам перебирати дані, які надходять асинхронно, на вимогу. Наприклад, коли ми завантажуємо щось частинами через мережу. А асинхронні генератори роблять це ще зручніше.
Давайте спочатку розглянемо простий приклад, щоб зрозуміти синтаксис, а потім розглянемо реальний варіант використання.
Пригадування ітераторів
Згадаймо тему про ітератори.
Ідея полягає в тому, що ми маємо об’єкт, наприклад, 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, що перебирається: