Как стать автором
Обновить

Комментарии 12

А какой кейс может быть для использования асинхронных генераторов? Ведь получается так, что мы будем использовать асинхронные функции, которые еще и внутри себя будут использовать асинхронные функции?
Мне кажется, что как минимум можно сделать несколько асинхронных запросов, перед тем, как вернуть результат. Но это безумно надуманный вариант.
Так есть Promise.all() для этого.
Я говорю, из того, что понял я, получается работа с асинхронным кодом внутри уже асинхронного кода. При этом используя две разные технологии.
В асинк генераторах просто удобнее и предсказуемее писать асинк код, так же как и в асинк функциях.
Например, вместо
async function* poll(url){
  let p = Promise.resolve();
  while(true){
    p = p.then(()=> fetch(url).then(call => call.json())
    yield p;
    p.then(() => delay(500));
  }
}

можно
async function* poll(url){
  while(true){
    const call = await fetch(url);
    yield await call.json();
    await delay(500);
  }
}
Первый листинг с ошибками, должно быть так
function* poll(url){
  let p = Promise.resolve();
  while(true){
    p = p.then(()=> fetch(url).then(call => call.json())
    yield p;
    p = p.then(() => delay(500));
  }
}
А можно чуть-чуть пояснить, что тут происходит (для человека, хорошо знакомого с промисами и не очень — с генераторами)?
У .all() как минимум нет заданной последовательности. async получить ссылки => async получить данные по ссылкам => await вернуть данные.
По сути это просто синтаксический сахар, т.к. там те же промисы.
Но на самом деле удобно: когда-то давно попробовал, теперь постоянно так пишу. Код становится проще и понятнее.
Так же как и в python — экономия памяти при генерировании и итерировании коллекций.
Ну и почему минус? Обоснуйте.
Модными тенденциями не интересуюсь, смотрю свое, поэтому хотел бы узнать, товарищ на фото выше как связан с темой статьи?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий