Почему Promises.all не работает в моем магазине Vuex - PullRequest
1 голос
/ 10 февраля 2020

Прямо сейчас я сталкиваюсь со странной проблемой. В моем проекте vue есть магазин vuex, который разделен на разные модули. Я хочу использовать Promise.all() для одновременного выполнения двух независимых асин c действий vuex, чтобы воспользоваться преимуществом поведения первый сбой .

store / modules / category:

    async CATEGORIES({ rootState }) {
        const response = await axios.post('link_to_api', {
            // some arguments for the api
            arg: rootState.args
        })

        return response
    }

магазин / модули / транспорт:

    async TRANSPORTATION({ rootState }) {
         const response = await axios.post('link_to_api', {
            // some arguments for the api
            arg: rootState.args
        })

        return response
    }

Я знаю, что хочу вызвать эти асин c функции в Promise.all:

магазин / модули / категории:

    async PUT_CATEGORIES({ commit, dispatch, rootState }) {
      try {
         const [resCategories, resTransportation] = await Promise.all([
            dispatch('CATEGORIES').catch(err => { console.log('Fehler bei Kabinenabfrage!'); throw {error: err, origin: 'kabine'}; }),
            dispatch('transportation/TRANSPORTATION', {root:true}).catch(err => { console.log('Fehler bei Flugabfrage!'); throw {error: err, origin: 'flug'}; })
        ]) 
         //do something after both promises resolved

      } catch(error) {
            // do something if one promise rejected
            commit('errorlog/ERROR', 4, {root:true})
            dispatch("errorlog/LOG_ERROR", {'origin': '2', 'error_code': '113', 'message': error.toString()}, {root:true})
            router.push({path: '/Error'})
        }  

Я получаю следующую ошибку:

error message

Это странно, потому что я использовал {root:true} и префикс transport в диспетчере для доступа к действию транспортного модуля в хранилище. Это прекрасно работает для действия LOG_ERROR в модуле errorlog , который я использую в блоке catch.

Если я скопирую действие ТРАНСПОРТИРОВКА в модуле категорий, это прекрасно работает ...

Кто-нибудь сталкивался с этой проблемой раньше и есть совет ??

Заранее спасибо!

1 Ответ

1 голос
/ 10 февраля 2020

В вашем случае, {root:true} передается как второй аргумент, хотя он должен быть передан как третий.

- dispatch('transportation/TRANSPORTATION', {root:true})
+ dispatch('transportation/TRANSPORTATION', null, {root:true})

В соответствии с vuex's do c

Чтобы отправить действия или зафиксировать мутации в глобальном пространстве имен, передайте {root: true} в качестве 3-го аргумента для отправки и фиксации.

Они также предоставляют пример кода (который далее упрощенно)

modules: {
  foo: {
    namespaced: true,
    actions: {
      // dispatch and commit are also localized for this module
      // they will accept `root` option for the root dispatch/commit
      someAction ({ dispatch, commit, getters, rootGetters }) {
        dispatch('someOtherAction') // -> 'foo/someOtherAction'
        dispatch('someOtherAction', null, { root: true }) // -> 'someOtherAction'
...