【问题标题】:Vuex - Run function after multiple dispatchesVuex - 多次分派后运行功能
【发布时间】:2019-07-12 12:54:48
【问题描述】:

我正在创建一个应用程序,在某个时候我需要加载一些数据,但是为了让用户看不到损坏的数据,我正在插入一个加载组件。

目前我在负载中设置了一个 setTimeout,但在某些时候 API 响应可能需要超过 1 秒。所以我想只有在所有调度都完成后才更新加载状态。

MainComponent.vue

beforeCreate() {
    this.$store.dispatch('responsibles/fetchData')
    this.$store.dispatch('events/fetchData')
    this.$store.dispatch('wallets/fetchData')

    // Need to run this setTimeout after all the above dispatches become completed...
    setTimeout(() => {
        this.loading = false
    }, 1000)
}

store/modules/responsibles.js

const state = {
    responsibles: []
}

const actions = {
    fetchData({dispatch}) {
        function getresponsibles() {
            return http.get('responsibles')
        }

        axios.all([
            getresponsibles()
        ]).then(axios.spread(function (responsibles) {
            dispatch('setResponsibles', responsibles.data.data)
        })).catch(error => console.error(error))
    },
    setResponsibles({commit}, responsibles) {
        commit('SET_RESPONSIBLES', responsibles)
    }
}

const mutations = {
    SET_RESPONSIBLES(state, responsibles) {
        state.responsibles = responsibles
    }
}

store/modules/events.js

const state = {
    events: []
}

const actions = {
    fetchData({dispatch}) {
        function getEvents() {
            return http.get('events')
        }

        axios.all([
            getEvents()
        ]).then(axios.spread(function (events) {
            dispatch('setEvents', events.data.data)
        })).catch(error => console.error(error))
    },
    setEvents({commit}, events) {
        commit('SET_EVENTS', events)
    }
}

const mutations = {
    SET_EVENTS(state, events) {
        state.events = events
    }
}

store/modules/wallets.js

const state = {
    wallets: []
}

const actions = {
    fetchData({dispatch}) {
        function getWallets() {
            return http.get('wallets')
        }

        axios.all([
            getWallets()
        ]).then(axios.spread(function (wallets) {
            dispatch('setWallets', wallets.data.data)
        })).catch(error => console.error(error))
    },
    setWallets({commit}, wallets) {
        commit('SET_WALLETS', wallets)
    }
}

const mutations = {
    SET_WALLETS(state, wallets) {
        state.wallets = wallets
    }
}

【问题讨论】:

    标签: javascript vue.js vuex vue-cli-3


    【解决方案1】:
    1. 让你的操作returnPromise 由 Axios 创建,例如

      return axios.all(...
      

      https://vuex.vuejs.org/guide/actions.html#composing-actions

    2. 将您的调度调用封装在 Promise.all 中并等待它们全部完成

      Promise.all([
        this.$store.dispatch('responsibles/fetchData'),
        this.$store.dispatch('events/fetchData'),
        this.$store.dispatch('wallets/fetchData')
      ]).finally(() => {
        // using "finally" so even if there are errors, it stops "loading"
        this.loading = false
      })
      

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 2011-03-04
      • 1970-01-01
      • 2019-02-25
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多