我需要在模板编译前进行2次异步操作。
methods: {
getResults(){
return new Promise(resolve => {
if (this.$store.state.results) {
this.results = this.$store.state.results
resolve()
}
else {
const q = this.$route.query.q
this.$http.get('search/', {params: {q: q}}).then(response => {
this.$store.commit('postResults', {results: response.data.results, count: response.data.count})
resolve()
})
}
})
},
getDetail(){
return this.$http('vendor/detail/',{params:{
doc:id
}})
}
},
beforeMount(){
this.getResults().then(this.getDetail).then((response)=>{
this.detail=response
})
},
现在的情况是,getDetail
执行完后模板就开始编译了。。求大神解答:(
编译过程是同步的,请求过程是异步的,但是请求的数据会同步到界面,有问题?
你这里适合用vuex或者一个状态管理模块,数据保存在store,action用于发送异步请求,在组件层只需要关注我要什么数据,不需要关注这个请求过程
1.我先说为什么getdetail直接跑,因为new Promise的回调就是立即执行完成的,他不知道get 是否完成,$http发的请求本身就是一个promise,所以你不需要new promise,直接返回。
这样getResults才可以直接使用then方法,而且这个方法是在get成功之后执行的。
从store里取数据赋值给组件,不是这样写的,用vuex的mapGetter
用vuex的话,ajax请求是在 action里发的,actions里写好需要发送的请求,然后调用mutation把获取的数据放进state,然后你那边mapGetter拿到的数据自动更新,你就不用管了。
你想在组件里发送请求,直接调用 thia.$dispatch,去调用相应的actions,也不用处理回调什么乱七八糟的。