假设我有一个看起来像这样的传奇:
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 });
}
}
fech 成功,但这并不意味着用户实际登录了:
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)
或者我应该只有一个成功和一个错误,并在 reducer 中分析逻辑并构建与响应数据相关的存储?
最佳答案
错误逻辑应始终在 sagas
中处理。
在这种特殊情况下,您的 API 未抛出正确的错误,因为如果您的 API 调用不是成功
(例如,200
),则应在您捕获时处理该逻辑声明。
为什么这里没有处理这个错误?
如果您使用的是 axios
,这可能是 API 设计不当造成的结果(即,登录错误返回 200 而不是 400)。
如果只是您手动执行此操作,您应该抛出错误并在 sagas
中的 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 });
}
}
关于javascript - 响应逻辑应该发生在 saga 还是 reducer 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55070426/