Действие выполняется не асинхронно

Использую Vue.js + Vuex.

Имеется мутация

export function run (state, payload) {
  ...
}

, в которой, к примеру, рекрсивно считывается директория через fs.readdirSync(dir).

Имеется действие

export function run (context, payload) {
  return new Promise((resolve, reject) => {
    context.commit('run', payload)
    resolve()
  })
}

В компоненте вызываю действие

this.run({
  path:     this.path,
  symbols:  this.symbols
}).then(()=>
  console.log('GOOD: ')
).catch((err)=>
  console.log('BAD: ')
).finally(()=> {
  console.log('FINALLY ')
})

На мой взгляд, после вызова действия this.run должно начаться считывание директории, но при этом работа приложения не должна приостанавливаться.

Как запускать код в мутации, так сказать "в параллельном потоке"?

P.S. Про асинхронный fs.readdir знаю, но данную задачу требуется(хочу) решить именно через синхронные функции.


Ответы (1 шт):

Автор решения: Николай Парахневич

Асинхронность в сочетании с мутацией состояний может сильно усложнить вашу программу. Например, когда вы вызываете два метода, оба с асинхронными обратными вызовами, которые изменяют состояние, как вы узнаете, когда они были вызваны и какой обратный вызов был вызван первым? Именно поэтому мы хотим разделить две концепции. В Vuex мутации - это синхронные транзакции :

Чтобы обрабатывать асинхронные операции, давайте введем Actions .

Vuex

→ Ссылка