异步工作的生成器函数

时间:2017-05-08 21:16:54

标签: javascript asynchronous generator

我想要一个JS生成器函数返回一些东西,让我们说它的晚餐建议。它知道某些菜肴的名称,但如果我不喜欢它们中的任何一种,它将需要从远程服务器获取更多建议。所以我希望这可以工作:

const dishSuggestions = function* (){
  yield "pancakes";
  yield "pizza";
  fetchMealSuggestions().then(suggestions => {  // Or even better await.
    for (const suggestion of suggestions)
      yield suggestion;
  });
};

这显然不起作用,因为我不能从内部函数中屈服。所以我的问题是:如何获得这种行为?我可以吗?或者这是错误的工具?

1 个答案:

答案 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还必须返回异步迭代器才能使异步迭代生效。

话虽如此,这仍然是一个全新的功能,刚开始随每个浏览器一起发货。

More details

现在,请查看评论中的question Bergi recommended