【问题标题】:Redux saga channel blocking inconsistentlyRedux saga 通道阻塞不一致
【发布时间】:2023-08-05 03:57:01
【问题描述】:

我有一个 redux saga 设置,由于某种原因,当我试图从中 take 时,我的 channel 会阻塞,但我不知道为什么。

我有一个PubSub 机制,它订阅一个事件并在收到时调用这个函数:

const sendRoundEnd = (msg, data) => {
  console.log('putting round end')
  roundEndChannel.put({
    type: RUN_ENDED,
    data: data.payload
  })
}

我有一个这样定义的频道的观察者:

function* watchRoundEndChannel() {
  while(true) {
    console.log('before take')
    const action = yield take(roundEndChannel)
    console.log('after take')
    yield put(action)
  }
}

我有一个减速器设置,它正在监听 putRUN_ENDED,如下所示:

case RUN_ENDED:
  console.log(action)
  return {
    ...state,
    isRunning: false,
    roundResult: action.data
  }

最后,我在文件中有一个roundEndChannel const(但不在函数中),我将以下函数导出为数组的一部分,该数组被输入yield all[]

takeEvery(roundEndChannel, watchRoundEndChannel)

因此,如果我的理解是正确的,当我从我的 pubsub 获取消息时,我应该首先点击 sendRoundEnd,然后再点击 roundEndChannel,然后再点击 RUN_ENDED 操作。

但奇怪的是,当我运行这些函数并从 pubsub 接收消息时,会记录以下内容:

putting round end
before take

我从来没有到达过after take,这向我暗示该频道中没有任何内容,但我很确定情况并非如此,因为它应该是put 在事件中之前发布订阅的处理程序。

感觉好像我在这里遗漏了一些简单的东西,有没有人有任何想法(或者我可以在不同点检查频道以查看其中的内容的方法?)

【问题讨论】:

    标签: javascript redux-saga saga


    【解决方案1】:

    Arg,设法解决了这个问题。问题是我导出了包裹在 takeEvery 中的 watchRoundEndChannel,它抢走了我推送的事件。

    我导出了这样的函数fork(watchRoundEndChannel),一切正常。

    【讨论】: