【问题标题】:how to use while loop in generator function如何在生成器函数中使用while循环
【发布时间】: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


【解决方案1】:

在你声明它的时候尝试给viableId变量赋值,例如: 让可行Id = ""; // 如果你的变量会收到一个字符串值

如果您使用数字,或者给它一个数字值(通常人们使用 0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2022-11-21
    • 2017-05-15
    • 2012-04-28
    相关资源
    最近更新 更多