【发布时间】:2020-06-18 04:14:55
【问题描述】:
我是生成器函数的新手,并尝试在其中执行 while 循环。
export function* findRandomData(list, name) {
let searchList = true;
const formattedName = name
.replace(new RegExp('_', 'g'), ' ')
.toLowerCase();
const indexesToSearch = [];
for (let i = 0; i < list.length; i++) {
indexesToSearch.push(i);
}
let viableId;
// Search through results
while (searchList) {
// If there are no results left then finish
if (indexesToSearch.length === 0) {
searchList = false;
throw new Error('Could not find id');
}
// Find a random number that has not been selected already, then remove
const randomPosition = Math.floor(Math.random() * indexesToSearch.length);
indexesToSearch.splice(randomPosition, 1);
let title = list[randomPosition].title;
viableId = list[randomPosition].id;
const eligible = yield call(
isEligibleVideo,
title,
formattedName,
viableId
);
if (eligible) {
searchList = false;
}
}
return viableId;
}
但它返回 null,即使 while 循环尚未完成搜索。
const data = yield call(findRandomData, resp['res'], name);
错误
Error: Could not find id at findRandomData
我做错了什么
【问题讨论】:
-
我注意到您分配给
eligible,但测试eligibleVideo— 那些是一样的吗? -
是的,它符合条件,编辑错误。
eligible返回值。我尝试使用正常功能,但在生成器功能中不起作用 -
您没有访问任何
indexesToSearch的值。 -
indexesToSearch用于检查列表中的位置,一旦位置是随机生成的,它被删除,这样它就不会重新检查相同的数据两次 -
我也是这么想的,但是在填充后您当前使用它的方式只是获取它的长度并删除一个随机元素:缺少一些东西。例如,考虑一下如果
randomPosition被分配两次 3 会发生什么。
标签: javascript ecmascript-6 redux-saga es6-generator