javascript - 在等待承诺完成时无法在 Vue.js 中获取 DOM 更新
问题描述
尽管我通常知道足够危险,但我并不是非常精通 JS 承诺。我正在研究处理搜索中存在的大型数据对象的 Vue 方法this.data()
- 通常当我通过 axios 发出异步请求时,这种相同的格式可以正常工作,但在这种情况下,我必须手动创建一个承诺来获得所需的行为。这是代码示例:
async searchPresets() {
if (this.presetSearchLoading) {
return
}
this.presetSearchLoading = true; // shows spinner
this.presetSearchResults = []; // removes old results
this.selectedPresetImports = []; // removes old user sections from results
// Need the DOM to update here while waiting for promise to complete
// otherwise there is no "loading spinner" feedback to the user.
const results = await new Promise(resolve => {
let resultSet = [];
for (var x = 0; x < 10000; x++) {
console.log(x);
}
let searchResults = [];
// do search stuff
resolve(searchResults);
});
// stuff after promise
}
问题是,promise 之后的东西可以正常工作。它在执行之前等待解决方案,并按应有的方式接收正确的搜索结果数据。
问题是 DOM 在调度 promise 时没有更新,所以 UI 就在那里。
有谁知道我做错了什么?
解决方案
尝试$nextTick()
:
Vue 2.1.0+:
const results = await this.$nextTick().then(() => {
let resultSet = []
for (var x = 0; x < 10000; x++) {
console.log(x)
}
let searchResults = []
// do search stuff
return searchResults
});
任何 Vue:
const results = await new Promise(resolve => {
this.$nextTick(() => {
let resultSet = []
for (var x = 0; x < 10000; x++) {
console.log(x)
}
let searchResults = []
// do search stuff
resolve(searchResults)
})
})
推荐阅读
- javascript - 将 python TensorFlow Layers 模型加载到 JavaScript 中
- jquery - 用 jQuery 替换 @page (CSS)
- python - 将 statsmodel.api 格式转换为 Scikit Learn 格式
- python - 如何修复“TypeError:需要一个整数”
- elisp - 如何调试?emacs lisp 程序行为未达到预期但执行与命令相同?
- nvm-windows - “nvm use 10.14.0”导致“ng server”错误
- awk - 在 awk 脚本中使用管道和 shell 命令
- python - 基于 ResNet 的 UNet 的 Pytorch 实现
- rust - 尝试从 actix-web 路由处理程序函数中发出请求时出现错误“BlockingClientInFutureContext”
- r - 在 RStudio 中检测项目类型