【发布时间】:2018-05-29 18:34:08
【问题描述】:
假设我有一个函数,它接受一个生成器并返回第一个 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(有关设置,请参见this answer):
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 中自动“异步化”生成器函数?
【问题讨论】:
标签: javascript async-await generator babeljs ecmascript-next