Javascript Redux saga事件通道在执行另一个saga后终止
我正在使用sagaJavascript 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
eventChannel
来监听正在触发的事件(可能是实际应用中的WebSocket),然后我正在更新我的Redux商店。在组件中,我调用一个API操作。然后是一个间隔(轮询),由一个传奇故事处理。一旦API第一次成功,我将连接我的事件侦听器
在第二次API调用之后,myeventChannel
以某种方式终止
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
,并完全避免取消