Vue.js:vuex 操作中未捕获的承诺

Posted

技术标签:

【中文标题】Vue.js:vuex 操作中未捕获的承诺【英文标题】:Vue.js: Uncaught promises in vuex actions 【发布时间】:2018-12-16 12:45:00 【问题描述】:

我了解 vuex 操作返回承诺,但我还没有在 vuex 中找到处理错误的理想模式。我目前的方法是在我的 axios 插件上使用错误拦截器,然后将错误提交到我的 vuex 存储。

plugins/axios.js

export default function( $axios, store ) 
    $axios.onError(error => 
        store.dispatch('setError', error.response.data.code);
    );

store/index.js

export const state = () => (
    error: null,
);

export const mutations = 
    SET_ERROR(state, payload) 
        state.error = payload;
    ,


export const actions = 
    setError( commit , payload) 
        commit('SET_ERROR', payload);
    ,
;

然后我会使用 错误组件 观察错误状态并显示是否有错误。因此,在我的操作或分派该操作的组件中确实无需捕获任何错误。但是我不禁担心它是否是糟糕的设计导致未捕获异常?如果我通过这种设计处理错误,我会遇到什么问题?有什么更好的方法可以做到这一点?

【问题讨论】:

【参考方案1】:

我认为您应该在 vuex 操作中进行 API 调用,如果失败,则使用 API 调用的错误拒绝承诺。我会避免列出所有 Axios 错误,而是在错误返回时处理错误,在我看来,这样维护和调试会更容易

例如:

getCartItems: function (commit, url) 
    return axios.get(url).then(response => 
      commit('setCartItems', response.data)
      return response
    ).catch(error => 
      throw error
    )
 ,

【讨论】:

如果axios.get 已经返回了一个promise,为什么还要包装一个新的promise?只需返回那个承诺。 @AdamReis 这绝对是一个有效的评论,我现在已经更改了示例代码,谢谢!【参考方案2】:

改进了上述示例以避免多余的 promise 包装并使用 async/await 来简化代码:

export const getCartItems = async (commit, url) => 
  const response = await axios.get(url);
  commit('setCartItems', response.data)
  return response;
;

【讨论】:

以上是关于Vue.js:vuex 操作中未捕获的承诺的主要内容,如果未能解决你的问题,请参考以下文章

react/redux 应用程序中的 js 承诺中未捕获的错误

从 vuex 操作返回 axios 承诺

当响应是错误时,为啥承诺会进入 .then() ? - 拉拉维尔

返回承诺的 Vuex 操作永远不会解析或拒绝

未捕获(承诺中)类型错误:无法读取未定义的属性“uid”

Vue:未捕获(承诺中)TypeError:无法读取未定义的属性'_c'