在axios
中,为什么throw new Error()
不允许在catch()
中使用?我在这样的要求,如果一个错误是由服务器返回,catch块应该抛出一个错误,稍后将由redux-saga处理和适当的行动将被分派。
API调用:
export const userSignupApi = userDetails => {
const endpoint = `${URL_ROOT}${URN_SIGNUP}`;
axios
.post(endpoint, userDetails)
.then(response => {
console.log("Response: ", response);
//do something with the response
})
.catch(error => {
throw new Error(error.response.data.message);
});
};
字符串
由于上面的catch块,我得到了Unhandled Rejection (Error)
。下面是我的 Saga ,它处理的操作:
import { call, takeLatest, put } from "redux-saga/effects";
function* handleUserSignup(action) {
try {
yield call(userSignupApi, action.userDetails);
yield put(userSignupSuccess()); //dispatching success action
} catch (error) {
yield put(userSignupFail(error)); //dispatching error action
}
}
function* watchUserSignup() {
yield takeLatest(NEW_USER.SIGNUP, handleUserSignup);
}
型
编辑:为什么我需要上面的代码结构?因为这使得对API代码和 Saga 代码进行单元测试变得容易。
4条答案
按热度按时间mbyulnm01#
在
userSignupAPI
中创建的Promise没有在任何地方使用(它甚至没有被返回),所以当catch
中抛出错误时,Promise链解析为(未捕获的)被拒绝的Promise,导致错误。在
userSignupAPI
的调用者中,您应该await
调用,以便handleUserSignup
内部的try
/catch
将看到抛出的错误:字符串
(make确保
call
返回userSignupApi
返回的Promise
)rfbsl7qr2#
我把它修好了。我做得完全不对。根据@certianPerformance的建议,在阅读了一些问题和github问题后,我找到了正确的处理方法。我应该返回
promise
,而不是返回API响应。解决方案如下:
字符串
Saga :
型
jfewjypa3#
我一直在找这个,但没有找到答案。这是我发现的第一个问题。
我认为在特定情况下捕获并重新抛出错误以使其冒泡是完全有效的,例如,我一直在使用可观察数据。
无论如何,对我有效的只是返回一个Promise。reject(err)
字符串
piok6c0g4#
您使用
try catch
是因为您不想在catch
中处理的浏览器控制台中抛出错误。在catch
中抛出错误将删除它的用途。如果你想抛出错误,请删除try catch
(这不是推荐的方法)更新
catch方法捕获API url抛出的任何错误。如果你不想捕获错误并在浏览器中显示它,你可以删除catch块,或者你可以调用处理错误的动作。有关promise catch的更多信息,请参考here