【问题标题】:Javascript generator doesn't yield new resultsJavascript 生成器不会产生新的结果
【发布时间】:2021-08-15 14:17:10
【问题描述】:

我正在 React 中创建一个生成器函数,以逐步生成插入排序动画:

function* insertionSort(data) { // yield state of array at each step of sorting
  const inputArr = [...data]
  let n = inputArr.length
  for (let i = 1; i < n; i++) {
    // Choosing the first element in our unsorted subarray
    let current = inputArr[i]
    // The last element of our sorted subarray
    let j = i - 1
    while (j > -1 && current < inputArr[j]) {
      inputArr[j + 1] = inputArr[j]
      j--
    }
    inputArr[j + 1] = current
    yield inputArr
  }
  yield inputArr
}

export default insertionSort

并在每次按下按钮时调用 next() 函数:

      <button
        onClick={() => {
          console.log(insertionSort(data).next().value)
        }}>
        Insertion Sort
      </button>

但是,只有第一次按下按钮会产生预期的结果。随后的每一次新闻都只是复制同样的东西。

我确信函数逻辑是正确的,因为删除生成器语法并将其用作正常循环会产生正确的结果。

我是否遗漏了 yield 的工作原理?

【问题讨论】:

  • 你应该更新data参数,每次你的生成器产生结果时,使用setState。
  • 感谢老兄的回复。可悲的是,这并没有解决它,再次得到相同的结果:(

标签: javascript generator


【解决方案1】:

每次调用insertionSort(data) 都会创建一个从头开始的新生成器。您在新实例上反复执行第一步。你会想要使用

const sorter = useRef();

<button onClick={() => {
  console.log(data);
  sorter.current = insertSort(data);
}}>
  Start Insertion Sort
</button>
<button onClick={() => {
  console.log(sorter.current.next().value);
}}>
  Step
</button>

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多