javascript - 如何在 axios catch() 块中重新抛出捕获的错误
问题描述
里面,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);
});
};
Unhandled Rejection (Error)
由于上面的 catch 块,我得到了。下面是我处理操作的传奇:
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 代码的单元测试变得容易。
解决方案
中创建的 PromiseuserSignupAPI
没有在任何地方使用(甚至没有被返回),因此当内部抛出错误时catch
,Promise 链解析为(未捕获的)被拒绝的 Promise,从而导致错误。
在 的调用者中userSignupAPI
,你应该await
调用,这样try
/catch
里面handleUserSignup
就会看到抛出的错误:
export const userSignupAPI = userDetails => {
const endpoint = `${URL_ROOT}${URN_SIGNUP}`;
return axios
.post(endpoint, userDetails)
.then(response => {
console.log("Response: ", response);
})
.catch(error => {
throw new Error(error.response.data.message);
});
};
async function* handleUserSignup(action) {
try {
yield await 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);
}
(确保call
返回Promise
返回的userSignupApi
)
推荐阅读
- elasticsearch - 如何在弹性搜索的索引中创建计算字段?
- javascript - 正则表达式:如何(更好地)优化来自/用于消息的文本
- google-apps-script - 如果 Google 工作表宏中的特定工作表为空,则隐藏或过滤行或列
- java - 为什么 Java WatchService 保持打开的文件句柄?
- excel - 计算一条信息出现的频率并计算该平均值
- c# - 将 2 个字符列表与二进制数字进行比较,目的是将第一个列表中的每个 0 替换为 1,如果在另一个列表中具有相同的位置 1
- ios - 应用程序在后台时,Firestore 存储上传任务观察器未执行
- django - 无法在 Django 视图中访问当前的 CustomUser,但可以在模板中使用
- python - 遍历所有二进制组合,其中一些数字为“?”
- javascript - 如何使用 NativeScript 更改值数据绑定字符串