假设我有一个看起来像这样的传奇:
export function* incrementAsync(action) {
try {
const res = yield call(Api.signin.create, action.payload);
yield put({
type: USER_SIGN_IN_FETCH_SUCCESS,
payload: res.data.auth
};
} catch (e) {
yield put({ type: USER_SIGN_IN_FETCH_ERROR_NETWORK });
}
}
这次尝试成功了,但这并不意味着用户实际上已经登录:
res.data.auth.error
可能是真的
我的问题是我是否应该做类似的事情:
if (//user was succesfully logged in)
yield put(//user was successfully logged in)
else if //wrong username
yield put(//wrong username)
else if //wrong password
yield put(//wrong password)
或者我应该只有一个代表成功,一个代表错误,并且在化简器中分析逻辑并相对于响应数据建立存储?
答案 0 :(得分:3)
错误逻辑应始终在sagas
处处理。
在这种特殊情况下,您的API不会引发正确的错误,因为如果您的API调用不是success
(例如,200
),则应在catch语句中处理该逻辑。
为什么在那里不处理此错误?
如果您使用的是axios
,则可能是由于API的设计不正确(例如,登录错误返回200而不是400)导致的。
如果只是手工操作,则应该抛出错误并在catch
中的sagas
处理该逻辑。
所以我的建议是:
catch
语句中的错误逻辑。如果您必须解析响应以便以编程方式引发错误,请在API层执行此操作。
执行特定的操作来处理注册错误,或者只是执行通用的FAIL操作并将错误消息传递给它(然后将其存储在redux上以显示它)。
它看起来应该像这样:
export function* incrementAsync(action) {
try {
const res = yield call(Api.signin.create, action.payload);
yield put({
type: USER_SIGN_IN_FETCH_SUCCESS,
payload: res.data.auth
};
} catch (error) {
yield put({ type: USER_SIGN_IN_FAIL, payload: error.message });
}
}
答案 1 :(得分:-1)
我总是将尽可能多的逻辑转移到减速器上。
逻辑在开发工具中更为明显,如果您在传奇中这样做,则可能会更困难。
它是同步和纯函数,因此也更易于测试。
另外,对于我来说,USER_SIGN_IN_FETCH_SUCCESS
对于从传奇到减速器的动作(从组件到减速器的动作应该不太技术性)来说完全有意义。