actions
in Vuex sono asincroni. L'unico modo per far sapere alla funzione chiamante (iniziatore dell'azione) che un'azione è completa è restituire una Promessa e risolverla in un secondo momento.
Ecco un esempio: myAction
restituisce a Promise
, effettua una chiamata http e risolve o rifiuta la Promise
successiva, il tutto in modo asincrono
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);
})
})
}
}
Ora, quando il componente Vue viene avviato myAction
, otterrà questo oggetto Promise e potrà sapere se ha avuto successo o meno. Ecco un codice di esempio per il componente 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")
})
}
}
Come puoi vedere sopra, è molto utile actions
restituire a Promise
. Altrimenti non c'è modo per l'iniziatore dell'azione di sapere cosa sta succedendo e quando le cose sono abbastanza stabili da mostrare qualcosa sull'interfaccia utente.
E un'ultima nota riguardante mutators
- come hai giustamente sottolineato, sono sincrone. Cambiano roba nel state
, e di solito sono chiamati da actions
. Non è necessario mescolarsi Promises
con mutators
, come actions
gestire quella parte.
Modifica: le mie opinioni sul ciclo Vuex del flusso di dati unidirezionale:
Se accedi ai dati come this.$store.state["your data key"]
nei tuoi componenti, il flusso di dati è unidirezionale.
La promessa dell'azione è solo quella di far sapere al componente che l'azione è completa.
Il componente può prendere i dati dalla funzione di risoluzione promessa nell'esempio sopra (non unidirezionale, quindi non raccomandato), o direttamente dal $store.state["your data key"]
quale è unidirezionale e segue il ciclo di vita dei dati vuex.
Il paragrafo precedente presuppone che il tuo mutatore utilizzi Vue.set(state, "your data key", http_data)
, una volta completata la chiamata http nella tua azione.