承诺拒绝错误不会被catch方法“捕获”

时间:2020-05-17 13:55:45

标签: reactjs error-handling promise axios

我面临的一个问题是,我拒绝的承诺没有被我的catch语句抓住。我认为我的代码中有一些错误,我想念它,但是我似乎无法发现它。

上下文是这样的:每当向我的django后端服务器发出请求时,它都会通过axios拦截器检查访问令牌是否有效。如果令牌无效,它将通过一系列逻辑来刷新此访问令牌,否则,如果条件满足,我将注销用户。

这是我的代码的片段:

axiosInstance.interceptors.response.use(
    response => {
      return  response
    },error => {
         #####Bunch of unrelevant code######

        if (error.response.data.code === "token_not_valid" &&
            error.response.status === 401 && 
            error.response.statusText === "Unauthorized") 
            {   
                ###irrelevant code######

                if (refreshToken){
                   ###irrelevant code######

                    if (tokenParts.exp > now) {
                        return axiosInstance
                        .post('/token/refresh/', {refresh: refreshToken})
                        .then((response) => {

                            ###irrelevant code######
                            })
                            .catch(err => {
                                store.dispatch(messageactions.returnErrors(err.response.data))
                                console.log(err.response.data)
                            });
                        }else{
                            console.log("Refresh token is expired", tokenParts.exp, now);
                            window.location.href = '/login/';
                        }
                    }else{
                        console.log("Refresh token not available.")
                        window.location.href = '/login/';
                    }
            }
        store.dispatch(messageactions.returnErrors(error.response.data))
        console.log(error.response.data)
        return Promise.reject(error);               
      }
    );


    export default axiosInstance;

现在,当拦截器内部发生错误时,问题就来了:

因此在我的一个组件中,有一个API get方法,它将调用axiosInstance。如果axiosinterceptor中发生错误,它不会被.catch()所“抓住”,它仍将“认为”其有效,并尝试运行setState,这又将导致另一个错误

apiGet() {
    console.log('api get is called')
    try {
    axiosInstance.get('/customer-information/')
        .then(response => {
            this.setState({ customers: response.data });
            $('#customerlist').DataTable({
                "scrollY": "70vh",
                "scrollCollapse": true,
                "paging": false,
                "scrollX": true
            });
            console.log(response)
        })
    } catch (error) {
        console.log('faaaailed')
        console.log(error.stack);
   }
}

有人可以解释吗?我真的很感激!谢谢

0 个答案:

没有答案