gpt4 book ai didi

javascript - Redux saga 事件 channel 在执行另一个 saga 后终止

转载 作者:行者123 更新时间:2023-11-29 15:07:12 26 4
gpt4 key购买 nike

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

在第二次 API 调用后,我的 eventChannel 以某种方式终止。

事件列表:

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 传奇:

var countDownStarted = false

// Function to be called by saga taking action CALL_FAKE_API
function* fetchData() {
// Simulate some server delay
yield delay(1500)
// Call a function
// redux-saga "call" effect allows you to call a function
const result = yield call(getUserData)
yield put({ type: RECORD_USER, result })
if(!countDownStarted) {
yield fork(countDownSaga, 100)
countDownStarted= true
}
}

J fiddle : https://jsfiddle.net/2d9L8fse/2/

最佳答案

其实终止的不是事件 channel ,而是进入finally block ,因为saga本身被取消了。那是因为您使用 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 已经在运行并且您再次发送 CALL_FAKE_APItakeLatest 将取消之前的 saga - 包括它的所有附加子项,如 countDownSaga 传奇。

您可以尝试例如用 spawn 替换 fork 效果,创建一个分离的任务,即使 fetchData saga 被取消也不会被取消。

yield spawn(countDownSaga, 100)

如果您不需要取消获取本身,您也可以将 takeLatest 替换为 takeEvery 并完全避免取消。

关于javascript - Redux saga 事件 channel 在执行另一个 saga 后终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58813613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com