javascript - 响应逻辑应该发生在 saga 还是 reducer 中?

标签 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 });
  }
}

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/

相关文章:

php - 您可以根据 ajax 响应中提交的表单数据提示下载吗?

javascript - 使用按钮启用禁用单选按钮&谷歌的 CSS 不会格式化 "action"按钮

webpack - 使用 webpack 和 React × 变成 × 并缩小

javascript - getStaticProps 和 getServerSideProps 中的 fetch 是否与 native 浏览器 fetch API 相同?

Redux 表单字段组件和验证

javascript - Redux 存储更改后 React 组件不会更新

javascript - jquery动态添加div标签并在其中添加元素

javascript - 检查父复选框不会检查子复选框

javascript - 多个错误 auth0 react apollo babel webpack

reactjs - 使用异步数据初始化组件