2 回答
TA贡献1712条经验 获得超3个赞
我今天在 vuex 中使用保存承诺测试了这个,它完美地工作。例子:
async loadUsers ({ state, commit }) {
if (state.users.length) {
return state.users
}
if (state.fetchPromise) {
return state.fetchPromise
}
let promise = fetch(usersUrl).then((response) => {
commit('SET_USERS', response.data)
})
commit('SET_PROMISE', promise);
return promise
}
现在可以在许多完全独立的组件中使用它,而无需多次调用 request 并且不会破坏任何东西。例如它在主布局上运行它:
created () {
this.$store.dispatch('users/loadUsers')
}
它是在没有等待的情况下调用的,因此是异步的并且不会阻止渲染页面。但是在用户列表页面上,此列表是必需的,因此我们可以在这里放置:
async beforeMount () {
await this.$store.dispatch('users/loadUsers')
}
结果: loadUsers 将被分派两次 - 一次来自布局,第二次来自用户列表,但它只会发送请求一次。此外,用户列表将正确等待响应,而不是尝试呈现没有数据的内容。
TA贡献1865条经验 获得超7个赞
我不得不处理类似的事情,这就是我解决它的方法:
在您的主文件中,定义一个新的状态变量,称为pending。你可以在你的loadUsers操作中使用它:
async loadUsers ({ state, commit }) {
if (state.users.length) {
return state.users;
}
if (state.isPending) {
return;
}
commit('SET_PENDING_STATE', true);
const users = await fetch(usersUrl);
commit('SET_PENDING_STATE', false);
commit('SET_USERS', users);
}
添加回答
举报