Еще одна полезная функция, которая достигла стадии 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();
Как и обычные генераторы, вы получаете значения, но в отличие от обычных генераторов вы можете ждать обещаний.
Это все, ребята,
Спасибо за чтение!