javascript - 如何使用 Redux-Saga 处理 fetch() 响应中的错误?

标签 javascript redux fetch-api redux-saga

我尝试处理 Unauthorized使用 redux-saga 的服务器出错。这是我的传奇:

function* logIn(action) {
  try {
    const user = yield call(Api.logIn, action);
    yield put({type: types.LOG_IN_SUCCEEDED, user});
  } catch (error) {
    yield put({type: types.LOG_IN_FAILED, error});
  }
}

我获取这样的数据:
fetchUser(action) {
  const {username, password} = action.user;
  const body = {username, password};
  return fetch(LOGIN_URL, {
    method,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(body)
  })
    .then(res => {
      res.json().then(json => {
        if (res.status >= 200 && res.status < 300) {
          return json
        } else {
          throw res
        }
      })
    })
    .catch(error => {throw error});
}

但无论如何结果是{type: 'LOG_IN_SUCCEEDED', user: undefined}当我期待 {type: 'LOG_IN_FAILED', error: 'Unauthorized'} .我的错误在哪里?如何使用 Redux-Saga 正确处理错误?

最佳答案

不要处理 thenerror在您的 fetchUser方法和你的传奇。既然你已经是 try/catch在你的传奇中,你可以在那里处理它。

例子

佐贺

function* logIn(action) {
  try {
    const response = yield call(Api.logIn, action);

    if (response.status >= 200 && response.status < 300) {
      const user = yield response.json();

      yield put({ type: types.LOG_IN_SUCCEEDED, user });
    } else {
      throw response;
    }
  } catch (error) {
    yield put({ type: types.LOG_IN_FAILED, error });
  }
}

拿来
fetchUser(action) {
  const { username, password } = action.user;
  const body = { username, password };

  return fetch(LOGIN_URL, {
    method,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(body)
  })
}

附带说明:我发现 fetch的 api 有点尴尬,因为它返回一个 then -当您提出请求时能够响应。那里有很多图书馆。我个人更喜欢axios默认情况下返回 json。

关于javascript - 如何使用 Redux-Saga 处理 fetch() 响应中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40007935/

相关文章:

javascript - react-redux/react-router 连接和 withRouter 函数的 ownProps 参数的 PropTypes?

javascript - 调度不是服务器端渲染中的功能

javascript - 在react.js中将no-cors包含到 header 中以获取json内容时出现奇怪的错误

javascript - 未捕获( promise )TypeError : Cannot read property 'forEach' of undefined

javascript - 删除Jquery字符串中的最后8个字符

JavaScript - 直接在多行字符串中循环遍历数组并包含值

javascript - 为什么 Redux reducer 必须没有副作用?

javascript - Javascript 中带有 fetch 的相对路径

javascript - 防止 Chrome 浏览器在 Asp.net 中存储的地址自动填充建议

javascript - 在关闭 debugInfo 的情况下从 angular.element 获取范围的一些方法