响应逻辑应该发生在传奇或化简版中?

时间:2019-03-08 20:17:09

标签: 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 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)

或者我应该只有一个代表成功,一个代表错误,并且在化简器中分析逻辑并相对于响应数据建立存储?

2 个答案:

答案 0 :(得分:3)

错误逻辑应始终在sagas处处理。 在这种特殊情况下,您的API不会引发正确的错误,因为如果您的API调用不是success(例如,200),则应在catch语句中处理该逻辑。

为什么在那里不处理此错误? 如果您使用的是axios,则可能是由于API的设计不正确(例如,登录错误返回200而不是400)导致的。 如果只是手工操作,则应该抛出错误并在catch中的sagas处理该逻辑。

所以我的建议是:

  • 向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对于从传奇到减速器的动作(从组件到减速器的动作应该不太技术性)来说完全有意义。