如何终止';无限';JavaScript中的生成器?

如何终止';无限';JavaScript中的生成器?,javascript,ecmascript-6,generator,Javascript,Ecmascript 6,Generator,编辑:我编辑了更多的实际代码,我的“精简”示例似乎有点混乱 我有一个javascript数组,questions,长度未知,其中包含对象,每个“question”对应一个对象,每个对象都有形状 { questionID: 1, questionText:'bla bla bla', end: false } 我还有一个函数,getNextQuestion,它接受一个id并返回一个屏幕 const getNextQuestion=id=>R.find(R.propEq(['quest

编辑:我编辑了更多的实际代码,我的“精简”示例似乎有点混乱

我有一个javascript数组,
questions
,长度未知,其中包含对象,每个“question”对应一个对象,每个对象都有形状

{
  questionID: 1,
  questionText:'bla bla bla',
  end: false
}
我还有一个函数,
getNextQuestion
,它接受一个
id
并返回一个屏幕

const getNextQuestion=id=>R.find(R.propEq(['questionID',id))(问题);

(当然可以使用
Array.find
查找上述内容,但我正在探索Ramda)

我想编写一个生成器,从这个数组中生成一个特定的对象,由传入的
id
选择,直到生成一个具有
end==true

也就是说,具有此特定
id
的对象应该是生成器返回的最后一个值。在此之后,生成器应生成
{value:undefined,done:true

我想写些这样的东西

export function* questionGenerator() {
  let nextID = 1;
  let continueLoop = true;
  while (continueLoop) {
    const question = getNextQuestion(nextID);
    if (question.end) continueLoop = false;
    nextID = yield getNextQuestion(nextID);
  }
}
const qGen = questionGenerator();
const id = 1;
do {
  const result = gGen.next(i++)
  console.log(result.value)
} while (!result.done)
这样叫什么

export function* questionGenerator() {
  let nextID = 1;
  let continueLoop = true;
  while (continueLoop) {
    const question = getNextQuestion(nextID);
    if (question.end) continueLoop = false;
    nextID = yield getNextQuestion(nextID);
  }
}
const qGen = questionGenerator();
const id = 1;
do {
  const result = gGen.next(i++)
  console.log(result.value)
} while (!result.done)
但我不确定这是不是最好的写法


有更好的方法吗?

您可以从生成器返回
,这将简化您的代码:

 while (true) {
  const screen = getNextScreen(nextID);
  nextID = yield screen;
  if (screen.end) return;   
 }

您需要在生成器中进行一些更改以返回生成器,并在循环中对生成器的调用进行另一个更改

const questions=[{questionID:1,questionText:'blablabla',end:false},{questionID:2,questionText:'blabla bla',end:false},{questionID:3,questionText:'bla bla bla',end:false},{questionID:5,questionText:'bla bla bla bla bla bla bla bla bla,end:false},{;
const getNextQuestion=(数组=>id=>array.find({questionID}=>questionID==id))(问题);
函数*questionGenerator(){
设nextID=1;
while(true){
const question=getNextQuestion(nextID);
nextID=收益率问题;
如果(问题结束)返回;
}
}
const gGen=questionGenerator();
var-id=1;
while(true){
const result=gGen.next(id++);
如果(结果完成)中断;
console.log(result.value);
}

<代码>。作为控制台包装器{最大高度:100%!重要;顶部:0;} <代码>你有一个运行示例吗?收益率的结果是传递到下一个的值,我想这能在生成器和客户端之间双向通信。这可能会有帮助。
真的是一次返回一个屏幕,下一次返回一个id吗?您能提供函数的代码吗
getNextScreen