在我的场景中,用户可以兑换优惠券。虽然她没有登录,但她仍然可以测试兑换功能以了解其工作原理。
我有2个流量,notLoggedInRedeemFlow
用于未登录的情况,loggedInRedeemFlow
以防她登录。
我有root saga,应该根据用户登录状态启动一个流并停止另一个流。
我想出了一个流与一个cancellation
动作之间的竞争。
在应用启动时,notLoggedInRedeemFlow
处于活动状态,应在用户登录时结束。
然后loggedInRedeemFlow
启动并运行,直到用户退出。
function* redeemFlows() {
while (true) {
const result = yield race({
fake: call(notLoggedInRedeemFlow),
gotAccessToken: take([accountActions.LOGIN_SUCCESS, accountActions.START_SIGNUP_SUCCESS]),
})
yield race({
run: call(loggedInRedeemFlow, result.gotAccessToken.payload.access_token),
logout: take(accountActions.LOGOUT_SUCCESS),
})
}
}
我的问题是,如果这是在redux-sagas中处理这种情况的最佳方法吗?
答案 0 :(得分:0)
如果我正确理解您的用例,那么我相信您需要从UI触发的REDEEM操作以及解释您是否已登录的传奇。如果您已登录,则请执行REDEEM_LOGGED_IN操作,否则请执行REDEEM_NOT_LOGGED_IN操作。并且会有子传奇分别处理REDEEM_LOGGED_IN和REDEEM_NOT_LOGGED_IN动作。
import {takeLatest} from 'redux-saga';
export default function* rootSaga () {
yield takeLatest('REDEEM', handleGenericRedeem);
yield takeLatest('REDEEM_NOT_LOGGED_IN', handleRedeemNotLoggedIn);
yield takeLatest('REDEEM_LOGGED_IN', handleRedeemLoggedIn);
}
确切的操作名称以及是否使用takeLatest取决于您和您的特定用例。您可能不需要也不想要takeLatest,但代码片段应该让您了解如何以一种方式解决问题。