Javascript Redux saga事件通道在执行另一个saga后终止

Javascript Redux saga事件通道在执行另一个saga后终止,javascript,reactjs,redux,react-redux,redux-saga,Javascript,Reactjs,Redux,React Redux,Redux Saga,我正在使用sagaeventChannel来监听正在触发的事件(可能是实际应用中的WebSocket),然后我正在更新我的Redux商店。在组件中,我调用一个API操作。然后是一个间隔(轮询),由一个传奇故事处理。一旦API第一次成功,我将连接我的事件侦听器 在第二次API调用之后,myeventChannel以某种方式终止 EventListner: function* countDownSaga(value) { const chan = yield call(countdown, va

我正在使用saga
eventChannel
来监听正在触发的事件(可能是实际应用中的WebSocket),然后我正在更新我的Redux商店。在组件中,我调用一个API操作。然后是一个间隔(轮询),由一个传奇故事处理。一旦API第一次成功,我将连接我的事件侦听器

在第二次API调用之后,my
eventChannel
以某种方式终止

EventListner:

function* countDownSaga(value) {
  const chan = yield call(countdown, value)
  try {    
    while (true) {
      // take(END) will cause the saga to terminate by jumping to the finally block
      let seconds = yield take(chan)
      console.log(`countdown: ${seconds}`)
    }
  } finally {
    console.log('countdown terminated')
  }
}
Api传奇:

function* countDownSaga(value) {
  const chan = yield call(countdown, value)
  try {    
    while (true) {
      // take(END) will cause the saga to terminate by jumping to the finally block
      let seconds = yield take(chan)
      console.log(`countdown: ${seconds}`)
    }
  } finally {
    console.log('countdown terminated')
  }
}
var countDownStarted=false
//saga采取行动调用\u FAKE\u API调用的函数
函数*fetchData(){
//模拟一些服务器延迟
产量延迟(1500)
//调用函数
//redux传奇的“调用”效果允许您调用函数
const result=yield调用(getUserData)
产生put({type:RECORD\u USER,result})
如果(!倒计时开始){
屈服叉(倒计时,100)
countDownStarted=true
}
}
Jsfiddle:

事实上,终止的不是事件频道,而是最后一块,因为传奇本身被取消了。这是因为您使用
takeLatest
来运行fetchData saga:

yield takeLatest(CALL_FAKE_API, fetchData)
在react组件中,每15秒发送一次CALL_FAKE_API操作:

componentDidMount() {
      const { callFakeApi } = this.props
      callFakeApi()
      this.timer = setInterval(function () { callFakeApi() }, 15 * 1000)
}
如果一个fetchData saga已经在运行,并且您再次调度
调用\u FAKE\u API
takeLatest
将取消以前的saga,包括其所有附加的子项,如
countDownSaga
saga

您可以尝试将
fork
效果替换为
spawn
,这样会创建一个分离的任务,即使fetchData saga被取消,该任务也不会被取消

yield spawn(countDownSaga, 100)
如果不需要取消提取本身,也可以将
takeLatest
替换为
takeEvery
,并完全避免取消