Comments 14
Похоже на чесание левой пяткой правого уха.
Тогда ещё не было async/await
, поэтому генераторы использовались для имитации "плоского асинхронного кода"
function sleep(n) {return new Promise(resolve=>setTimeout(resolve, n))}
async function* count(n=0) {while (true) {await sleep(100);yield n++}}
const iter = count(0);
await Promise.all(
Array(10).fill().map(async ()=>(await iter.next()).value)
); // [0, 1, ,2 ,3, 4, 5, 6, 7, 8, 9]
function* count(n=0) {while (true) {setTimeout(undefined,100);yield n++}}
const iter = count(0);
await Promise.all(
Array(10).fill().map(()=>(iter.next()).value)
); //(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
или чего-то недопонимаю?
Сорри за поздний ответ, в вашем примере setTimeout сам по себе, а yield, сам по себе (setTimeout != sleep), т.е. yield выполнится без ожидания. На самом деле я привел этот пример как обращение с api - частый случай, типа докачка данных, и всегда асинхронное.
Так для того же и await, чтоб подождать промиса... Не так же работает код. Представьте вместо sleep() fetch()
Затем, что это последовательное, а не паралельное обращение, ваш первый пример работает не так же. Блин тут неудобно дискутировать, я раз в сто лет вижу сообщения, мне кажется вы просто по другому видите пример. Идея в том, чтобы абстрагировать апи с докачкой например от кода, т.е. сделать генератор, который будет просто возвращать next значение, Promise.all - снаружи штука,
3-ю часть бы для полноты картины
Углублённое руководство по JavaScript: генераторы. Часть 2, простой пример использования