pil*_*avi 12 async-await vue.js vuex
我想知道如何在Vuex中使用async/await动作.所述文档提供此语法作为一个例子:
actions: {
async actionA ({ commit }) {
commit('gotData', await getData())
},
async actionB ({ dispatch, commit }) {
await dispatch('actionA') // wait for `actionA` to finish
commit('gotOtherData', await getOtherData())
}
}
Run Code Online (Sandbox Code Playgroud)
按照这个例子,我有:
import Vue from 'vue';
import Vuex from 'vuex';
import * as firebase from 'firebase';
Vue.use(Vuex);
export const store = new Vuex.Store({
state: {
// other state vars here
resource: null
},
mutations: {
// saveValues
setResource(state, payload) {
state.resource = payload;
}
},
actions: {
async getResource({ commit, dispatch }) {
var resource
console.log('resource1: ' + resource)
Vue.http.get('https://mysite/api/getResource')
.then((response) => {
console.log('get resource')
var data = response.body;
resource = data.access_resource;
console.log('resource2: '+ resource)
commit('setResource', resource);
var foo = store.getters.resource;
console.log('resource3: ' + foo);
}, (error) => {
console.log(error);
});
},
async getSomeApi({ commit, dispatch }) {
console.log('getting api');
await dispatch('getResource');
var resource = store.getters.resource;
console.log('resource4: ' + resource);
Vue.http.get('https://somesite/api/someapi?resource=' + resource)
.then((response) => {
console.log("got something from somesite")
var data = response.body;
// do something with data -> payload
dispatch('saveValues', payload);
}, (error) => {
console.log(error);
});
}
},
getters: {
resource(state) {
return state.resource;
}
}
});
Run Code Online (Sandbox Code Playgroud)
但是,即使遵循文档中的语法示例,当我运行此代码时,async/await似乎完全被忽略.当我查看日志时,我看到,按以下顺序:
getting apiresource1: undefinedresource4: nullget resourceresource2: <expected-value>resource3: <expected-value>我希望console.log语句按数字顺序打印出来.如果有人能澄清我做错了什么,我将不胜感激.
Dec*_*oon 16
你不是await荷兰国际集团将Vue.http.get()在承诺getResource()的方法,这样await dispatch('getResource')既解决了HTTP请求解决之前.
修剪:
async getResource() {
let response
try {
response = await Vue.http.get('https://mysite/api/getResource')
} catch (ex) {
// Handle error
return
}
// Handle success
const data = response.body
}
Run Code Online (Sandbox Code Playgroud)