gpt4 book ai didi

reactjs - redux-saga 中的观察者有什么意义?

转载 作者:行者123 更新时间:2023-12-03 13:40:34 25 4
gpt4 key购买 nike

我刚刚接触 redux-saga,对观察者和生成器有点困惑

以下面的代码为例,它是我的 sagas 文件的入口点

function* employeesSaga() {
yield all([
takeEvery(getType(employeeActions.login.request), handleLoginRequest),
takeEvery(getType(employeeActions.verifyLogin.request), handleVerifyLoginRequest),
takeEvery(getType(employeeActions.logout), handleLogout)
]);
}

我直接将每个 redux 调用连接到相应的处理程序。

但是有些人使用观察者,然后他们调用该生成器中的处理程序。这样做的目的是什么?我应该使用该模式吗?

此外,我注意到有些人用 while(true) 包装整个处理程序,有必要吗?因为我的代码在没有它的情况下也可以正常工作...

最佳答案

关于第一个问题

这可能只是一个可读性问题。

观察者并不是真正的“模式”,它们只是让你的代码更明确地表达其意图:

function* watchLoginRequest() {
yield takeEvery(getType(employeeActions.login.request), handleLoginRequest)
}

function* watchVerifyLoginRequest() {
yield takeEvery(getType(employeeActions.verifyLogin.request), handleVerifyLoginRequest)
}

function* watchLogout() {
yield takeEvery(getType(employeeActions.logout), handleLogout)
}

function* startWatchers() {
yield call(watchLoginRequest)
yield call(watchVerifyLoginRequest)
yield call(watchLogout)
}

function* employeesSaga() {
yield call(startWatchers)
}

第二个问题

您可能正在谈论这种流程:

function* watchLoginRequest() {
while (true) {
const action = yield take(getType(employeeActions.login.request))
yield call(handleLoginRequest, action)
}
}

区别:

  • while(true)-take-call 流程不允许同时执行单个处理程序的两个实例。它执行一个操作,然后阻塞调用,直到 handleLoginRequest() 完成。如果用户在处理程序完成之前单击登录按钮,则会错过相应的操作。

  • takeEvery() 流程允许并发处理程序执行。这可能不是您想要的。

Redux-saga 文档告诉 how takeEvery() is implemented在引擎盖下:

const takeEvery = (patternOrChannel, saga, ...args) => fork(function*() {
while (true) {
const action = yield take(patternOrChannel)
yield fork(saga, ...args.concat(action))
}
})

你看,takeEvery()本身是非阻塞的(fork),并且它以非阻塞的方式执行处理程序(fork)。

第三种选择

还有takeLatest() ,它确实允许并发处理程序执行,但如果有一个处理程序的先前实例正在执行,则 cancels它。 Redux-saga 文档也提供了其内部实现。

我认为,while(true)-take-call 是最好的登录流程。您可能不希望并发登录。但是,如果您在 UI 级别阻止并发登录,这些流程是等效的,但 while(true)-take-call 是最明确和可读的。

关于reactjs - redux-saga 中的观察者有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53332262/

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