Vue.js,Vuex 与 Promises
Vue.js, Vuex vs. Promises
想象一下,我有一个 Vue 应用程序,其所需的部分结构如下:
我分为三个部分。其中:
1. Vue部分:
<template>
<div>
<div v-if="displayTable" class="dataTable">
...
</div>
</div>
</template>
<script>
export default {
...
methods: {
getDataset: function() {
this.$store.dispatch('getDataFromDB')
.then(() => {
if (this.$store.state.dataSet.length > 0) {
this.displayTable = true
}
})
}
}
...
}
</script>
2。 Vuex 部分
const actions = {
...
getDataFromDB ({commit}, payload) {
DataSources.apiGetData(payload.querystring)
.then(dataset => commit(GET_DATA, {dataset}))
}
...
}
3。 axios 部分
export const DataSources = {
...
return apiGetData (queryString) {
return axios.get('urlString').then(response => return response.data)
}
...
}
目标:
我需要在商店的 操作 中从数据库中检索和保存数据,并且仅在显示 div.dataTable 之后。这就是 Promise 的功能。
问题:
在我的例子中 then() 首先处理部分。
我应该怎么做才能解决它?
处理此问题的另一种方法是将 displayTable
作为计算值,避免异步调用可能引起的任何问题。
<template>
<div>
<div v-if="displayTable" class="dataTable">
...
</div>
</div>
</template>
<script>
export default {
...
computed: {
displayTable() {
return this.$store.state.dataSet.length > 0;
},
},
methods: {
getDataset: function() {
this.$store.dispatch('getDataFromDB');
}
}
...
}
</script>
this.$store.dispatch()
默认调用 return 一个 Promise,但是由于您没有 return 在正在调度的操作中执行任何操作,因此 Promise 会立即解析并且 then
处理程序将在异步 getDataFromDB
操作完成之前执行。
您需要 return 通过在 getDataFromDB
操作中调用 DataSources.apiGetData()
创建的 Promise:
getDataFromDB ({commit}, payload) {
return DataSources.apiGetData(payload.querystring)
.then(dataset => commit(GET_DATA, {dataset}))
}
这样,操作中的 Promise 就是 return 由 dispatch
调用编辑的内容,并且 then
处理程序在异步操作完成之前不会触发。
想象一下,我有一个 Vue 应用程序,其所需的部分结构如下:
我分为三个部分。其中:
1. Vue部分:
<template>
<div>
<div v-if="displayTable" class="dataTable">
...
</div>
</div>
</template>
<script>
export default {
...
methods: {
getDataset: function() {
this.$store.dispatch('getDataFromDB')
.then(() => {
if (this.$store.state.dataSet.length > 0) {
this.displayTable = true
}
})
}
}
...
}
</script>
2。 Vuex 部分
const actions = {
...
getDataFromDB ({commit}, payload) {
DataSources.apiGetData(payload.querystring)
.then(dataset => commit(GET_DATA, {dataset}))
}
...
}
3。 axios 部分
export const DataSources = {
...
return apiGetData (queryString) {
return axios.get('urlString').then(response => return response.data)
}
...
}
目标:
我需要在商店的 操作 中从数据库中检索和保存数据,并且仅在显示 div.dataTable 之后。这就是 Promise 的功能。
问题:
在我的例子中 then() 首先处理部分。 我应该怎么做才能解决它?
处理此问题的另一种方法是将 displayTable
作为计算值,避免异步调用可能引起的任何问题。
<template>
<div>
<div v-if="displayTable" class="dataTable">
...
</div>
</div>
</template>
<script>
export default {
...
computed: {
displayTable() {
return this.$store.state.dataSet.length > 0;
},
},
methods: {
getDataset: function() {
this.$store.dispatch('getDataFromDB');
}
}
...
}
</script>
this.$store.dispatch()
默认调用 return 一个 Promise,但是由于您没有 return 在正在调度的操作中执行任何操作,因此 Promise 会立即解析并且 then
处理程序将在异步 getDataFromDB
操作完成之前执行。
您需要 return 通过在 getDataFromDB
操作中调用 DataSources.apiGetData()
创建的 Promise:
getDataFromDB ({commit}, payload) {
return DataSources.apiGetData(payload.querystring)
.then(dataset => commit(GET_DATA, {dataset}))
}
这样,操作中的 Promise 就是 return 由 dispatch
调用编辑的内容,并且 then
处理程序在异步操作完成之前不会触发。