我的应用程序中有一个关于redux-saga的模式,对于asynchro调用我有两个函数 - 第一个是侦听某些指定的动作,第二个是调用api。
监听功能:
function* userJoinListener() {
while (true) {
const { user } = yield take(UserJoinRequest);
const promiseRace = yield race({
res: call(userJoinFunction, user),
err: take(UserJoinError),
});
if (promiseRace.res) {
// code if success
} else {
// code if fail
}
}
}
Api呼叫执行功能:
function* userJoinFunction(user) {
try {
return yield call(userJoin, user);
} catch (err) {
yield put(userJoinFail);
}
}
我的问题是:这里使用race
有什么好处?说实话,我可以在与race
相同的位置使用第二个函数,它会按预期工作:
function* userJoinListener() {
while (true) {
const { user } = yield take(UserJoinRequest);
try {
// code if success
return yield call(userJoin, user);
} catch (err) {
// code if fail
yield put(userJoinFail);
}
}
}
谢谢:)
相关问题:Difference between Promise.race() and try/catch in redux-saga
答案 0 :(得分:2)
确实在这里使用LibraryB
是不必要的复杂。
如果您在被叫传奇(race
)内部处理错误或取消,那么只需使用userJoinFunction
/ try..catch
即可。
另一方面,如果从外部发生某些事情(超时,用户操作),你需要取消传奇,那么使用cancel
效果是有意义的。