【问题标题】:Catch Axios exception in Vuex store and throw it to Vue.js method在 Vuex 存储中捕获 Axios 异常并将其扔给 Vue.js 方法
【发布时间】:2018-08-08 15:55:09
【问题描述】:

如何在 vuex 存储中捕获 axios 异常并将其扔给 vue.js 方法?我的目标是让这个异常能够使用this.$forceUpdate() 重置绑定到input 的计算值。

在我的方法中,我有这个:

methods: {
    mymet: _.debounce(
        function(table, id, key, event) {
            const value = event.target.value;
            this.$store.dispatch('UPDATE_TRANSACTIONS_ITEM', { table, id, key, value }).then(response => {
                event.target.classList.remove("is-invalid")
                event.target.classList.add("is-valid")
            }, error => {
                console.error("Got nothing from server. Prompt user to check internet connection and try again")
                this.$forceUpdate();
            })
        }, 500
    )
}

在我的 vuex 商店里,我有这个:

const actions = {
    UPDATE_TRANSACTIONS_ITEM ({ commit }, data) {
        let company = {
            [data.key]: data.value
        }
        axios.put(`/api/companies/${data.id}`, { company }).then( function ( response ) {
            commit('SET_TRANSACTIONS_ITEM_UPDATE', { profile: data })
        }).catch(function (error) {
            throw error
        })
    }
}

const mutations = {
    SET_TRANSACTIONS_ITEM_UPDATE (state, { profile }) {
        state.company_data[profile.key] = profile.value
    },
}

【问题讨论】:

    标签: vue.js axios vuex


    【解决方案1】:

    您需要使实际的动作函数异步。

    如果您有能力使用async functions,您可以等待axios 调用,然后让错误冒泡(无需在操作本身中抛出任何内容):

    const actions = {
      async UPDATE_TRANSACTIONS_ITEM ({ commit }, data) {
        let company = {[data.key]: data.value};
        await axios.put(`/api/companies/${data.id}`, { company }).then(() => {
          commit('SET_TRANSACTIONS_ITEM_UPDATE', { profile: data })
        });
      }
    }
    

    否则,您需要返回 Promise 并捕获错误并将其传递给 reject 处理程序:

    const actions = {
      UPDATE_TRANSACTIONS_ITEM ({ commit }, data) {
        return new Promise((resolve, reject) => {
          let company = {[data.key]: data.value};
          axios.put(`/api/companies/${data.id}`, { company }).then(() => {
            commit('SET_TRANSACTIONS_ITEM_UPDATE', { profile: data });
            resolve();
          }, (error) => reject(error));
        });
      }
    }
    

    【讨论】:

    • 这需要一个 try/catch 块,不是吗?
    • 您可以在异步示例中添加一个 try catch 块来处理操作中的错误,然后抛出错误,但如果您只是想让错误冒泡,则没有必要。
    • 啊哈我明白了,所以如果你不在更深层的方法中调用它,它会默认冒泡,对吧?
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 2019-04-03
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多