Javascript 响应逻辑应该发生在哪里,在传奇中还是在减速器中?
假设我有一个故事看起来是这样的:Javascript 响应逻辑应该发生在哪里,在传奇中还是在减速器中?,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,假设我有一个故事看起来是这样的: 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 p
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中分析逻辑并构建与响应数据相关的存储?我总是将尽可能多的逻辑移到reducer中。 逻辑在开发工具中更为明显,如果您在传奇中这样做,它可能会更难。 它也更容易测试,因为它是一个同步的纯函数。
另外,
USER\u SIGN\u IN\u FETCH\u SUCCESS
对于从saga发送到reducer的操作(从组件到reducer的操作应该不那么技术性)。错误逻辑应该始终在sagas
中处理。
在这种特殊情况下,您的API没有抛出正确的错误,因为如果您的API调用不是成功
(200
),那么该逻辑应该在catch语句中处理
为什么这里没有处理这个错误?
如果您使用的是axios
,则这可能是由于API设计不当造成的(即登录错误返回200而不是400)。
如果只是手工操作,那么应该在sagas
中的catch
中抛出一个错误并处理该逻辑
所以我的建议是:
- 向sagas抛出一个错误,以在
语句中处理错误逻辑catch
- 如果为了以编程方式抛出错误而必须解析响应,那么可以在API层进行解析
- 执行特定操作以处理注册错误,或者只执行一般失败操作并向其传递错误消息(然后将其存储在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 });
}
}
减速器唯一的任务是根据动作改变状态。你应该设计有意义的动作来触发可预测的状态变化。好吧,很好,但这意味着所有的逻辑都在saga生成器函数中?是的,因为只有在有某种加载动画的情况下,
用户签名才有意义,因为它不一定是登录成功。这个故事应该会产生有意义的动作,这样你的整个逻辑就更清晰,也更容易通过Redux开发工具进行调试。这是关于Reducer和action Creator,但对故事来说同样有效:就个人而言,如果你需要做可提取的逻辑,我更喜欢将其放入实用程序文件中。然后,您可以根据需要将其导入reducer或saga中,这两种方式都不会对代码产生太大影响。