actions
у Vuex є асинхронними. Єдиний спосіб дозволити функції виклику (ініціатора дії) знати, що дія завершена - це повернути Обіцяння та вирішити його пізніше.
Ось приклад: myAction
повертає a Promise
, здійснює http-дзвінок і Promise
пізніше вирішує або відхиляє - все асинхронно
actions: {
myAction(context, data) {
return new Promise((resolve, reject) => {
// Do something here... lets say, a http call using vue-resource
this.$http("/api/something").then(response => {
// http success, call the mutator and change something in state
resolve(response); // Let the calling function know that http is done. You may send some data back
}, error => {
// http failed, let the calling function know that action did not work out
reject(error);
})
})
}
}
Тепер, коли ваш компонент Vue ініціює myAction
, він отримає цей об’єкт Promise і може знати, вдався він чи ні. Ось приклад коду для компонента Vue:
export default {
mounted: function() {
// This component just got created. Lets fetch some data here using an action
this.$store.dispatch("myAction").then(response => {
console.log("Got some data, now lets show something in this component")
}, error => {
console.error("Got nothing from server. Prompt user to check internet connection and try again")
})
}
}
Як ви бачите вище, actions
повернути алімент дуже корисноPromise
. В іншому випадку ініціатор дії не може знати, що відбувається і коли все є досить стабільним, щоб щось відображати в інтерфейсі користувача.
І остання примітка щодо mutators
- як ви правильно зазначали, вони є синхронними. Вони змінюють речі в state
, і, як правило, викликаються зactions
. Там немає необхідності змішувати Promises
з mutators
, як actions
впоратися з цією частиною.
Редагувати: Мої погляди на цикл Vuex однонаправленого потоку даних:
Якщо ви отримуєте доступ до даних, як this.$store.state["your data key"]
у своїх компонентах, то потік даних односторонній.
Обіцянка від дії полягає лише в тому, щоб повідомити компоненту, що дія завершена.
Компонент може або приймати дані з функції вирішення обіцянок у наведеному вище прикладі (не однонаправлений, тому не рекомендується), або безпосередньо з $store.state["your data key"]
якого є односпрямованим і слідкує за життєвим циклом даних vuex.
У наведеному вище абзаці передбачається, що ваш мутатор використовує Vue.set(state, "your data key", http_data)
, як тільки http-дзвінок завершиться у вашій дії.