为什么axios .catch()会在redux中间件中捕获javascript错误?

问题描述:

我使用axios作为我的客户端,用于响应redux应用程序中的ajax请求。为什么axios .catch()会在redux中间件中捕获javascript错误?

要处理异步操作,我使用中间件将:

  1. 认识承诺对象
  2. 解决的承诺与then()如果成功或catch()如果不能对应其
  3. 解决承诺将派遣行动成功/失败行动。例如,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 
    } 
    } 
} 
+0

您使用什么中间件? –

+0

我使用我自己的中间件(在问题中添加了代码)@AlessanderFrança – Kiddo

我怎样才能确保.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