我想要一个JS生成器函数返回一些东西,让我们说它的晚餐建议。它知道某些菜肴的名称,但如果我不喜欢它们中的任何一种,它将需要从远程服务器获取更多建议。所以我希望这可以工作:
const dishSuggestions = function* (){
yield "pancakes";
yield "pizza";
fetchMealSuggestions().then(suggestions => { // Or even better await.
for (const suggestion of suggestions)
yield suggestion;
});
};
这显然不起作用,因为我不能从内部函数中屈服。所以我的问题是:如何获得这种行为?我可以吗?或者这是错误的工具?
答案 0 :(得分:2)
理论上,在这种情况下你想要的是一个包含异步迭代器的异步生成器。
这是看起来的样子:
// Note the * after "function"
async function* dishSuggestions() {
yield "pancakes";
yield "pizza";
// async iteration: yield each suggestion, one after the other
for await (const meal of fetchMealSuggestions()) {
yield meal;
}
}
async function logDishes() {
for await (const dish of dishSuggestions()) {
console.log(dish);
}
}
logDishes();
这是working transpilled demo with Babel。
请注意,fetchMealSuggestions
还必须返回异步迭代器才能使异步迭代生效。
话虽如此,这仍然是一个全新的功能,刚开始随每个浏览器一起发货。
现在,请查看评论中的question Bergi recommended。