为什么axios .catch()会在redux中间件中捕获javascript错误?
问题描述:
我使用axios作为我的客户端,用于响应redux应用程序中的ajax请求。为什么axios .catch()会在redux中间件中捕获javascript错误?
要处理异步操作,我使用中间件将:
- 认识承诺对象
- 解决的承诺与
then()
如果成功或catch()
如果不能对应其 - 解决承诺将派遣行动成功/失败行动。例如,GET_TRANSACTIONS将派遣 GET_TRANSACTIONS_SUCCESS或GET_TRANSACTIONS_FAIL
的问题是,每次应用程序获取错误(像undefined
访问属性),这将触发异步操作中间件catch()
处理和调度的失败行动,这是不相关的。
因此,javascript错误不会显示在控制台中,所以我不知道应用程序实际发生了什么。
调度失败操作的有效负载只是一个空对象。 (它应该是访问属性undefined
)
我怎样才能确保.catch()
只处理承诺错误,而不是JavaScript错误?
clientMiddleware.js
export const clientMiddleware = (client) => {
return ({ dispatch, getState }) => {
return next => action => {
if (typeof action === 'function') {
return action(dispatch, getState)
}
const { promise, types, ...rest } = action
if (!promise) {
return next(action)
}
const [REQUEST, SUCCESS, FAILURE] = types
next({ ...rest, type: REQUEST })
const actionPromise = promise(client)
actionPromise
.then((res) => next({ ...rest, payload: res, type: SUCCESS }))
.catch((err) => next({ ...rest, payload: err, type: FAILURE }))
return actionPromise
}
}
}
答
我怎样才能确保.catch()只处理承诺的错误,而不是JavaScript错误?
AFAIK没有。我们的应用程序遇到同样的问题。错误是一种吞噬。出于调试目的,我们使用这样的东西:
Promise.prototype.nativeCatch = Promise.prototype.catch;
Promise.prototype.catch = function(handler) {
return this.nativeCatch(function(error) {
try {
console.error(error.stack);
}
catch(error) {
}
handler(error);
});
};
+0
我看到...是否有可能添加另一个中间件来捕获任何javascript错误呢?如果可能,我宁愿不改变本地代码。 – Kiddo
您使用什么中间件? –
我使用我自己的中间件(在问题中添加了代码)@AlessanderFrança – Kiddo