Предположим, что у меня есть функция, которая принимает генератор и возвращает другой генератор первых элементов n
:
const take = function * (n, xs) {
console.assert(n >= 0);
let i = 0;
for (const x of xs) {
if (i == n) {
break;
}
yield x;
i++;
}
};
Использование:
const evens = function * () {
let i = 0;
while (true) {
yield i;
i += 2;
}
};
for (const x of take(10, evens())) {
console.log(x);
}
Теперь представьте, что evens
также async
(см. этот ответ для настройки):
const evensAsync = async function * () {
let i = 0;
while (true) {
yield i;
i += 2;
}
};
Это, конечно, не работает с take
:
const main = async () => {
for await (const x of take(10, evensAsync())) {
console.log(x);
}
};
main().catch(e => console.error(e));
Теперь я могу определить вариант take
, который async
:
const takeAsync = async function * (n, xs) {
console.assert(n >= 0);
let i = 0;
for await (const x of xs) {
if (i == n) {
break;
}
yield x;
i++;
}
};
const main = async () => {
for await (const x of takeAsync(10, evensAsync())) {
console.log(x);
}
};
main().catch(e => console.error(e));
... но какая хлопот!
Есть ли способ автоматически "асинхронировать" функции генератора в JavaScript?