gpt4 book ai didi

javascript - 如何在 JavaScript 中终止 'infinite' 生成器?

转载 作者:行者123 更新时间:2023-12-04 10:10:07 28 4
gpt4 key购买 nike

编辑:我编辑以包含更多实际代码,看来我的“瘦身”示例有点令人困惑。

我有一个 javascript 数组,questions包含对象的未知长度,每个“问题”一个,每个“问题”都有形状

{
questionID: 1,
questionText:'bla bla bla',
end: false
}

我也有一个功能, getNextQuestion这需要一个 id并返回一个屏幕
const getNextQuestion = id => R.find(R.propEq(['questionID'], id))(questions);

(当然可以将 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)

但我不确定这是否是最好的写法。

有没有更好的办法?

最佳答案

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

const questions = [{ questionID: 1, questionText:'bla bla bla', end: false }, { questionID: 2, questionText:'bla bla bla', end: false }, { questionID: 3, questionText:'bla bla bla', end: false }, { questionID: 4, questionText:'bla bla bla', end: false }, { questionID: 5, questionText:'bla bla bla', end: true }];

const getNextQuestion = (array => id => array.find(({ questionID }) => questionID === id))(questions);

function* questionGenerator() {
let nextID = 1;
while (true) {
const question = getNextQuestion(nextID);
nextID = yield question;
if (question.end) return;
}
}

const gGen = questionGenerator();

var id = 1;

while (true) {
const result = gGen.next(id++);
if (result.done) break;
console.log(result.value);
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 如何在 JavaScript 中终止 'infinite' 生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61371489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com