javascript - Vue 方法不接受异步/等待
问题描述
我正在开发一个 Vue.js 项目,我正在尝试运行一系列相互依赖的承诺。为了使这个示例简单,我已经删除了除一个之外的所有内容,并将其余部分替换为 console.log,它应该输出我尝试访问的值,然后稍后使用。如果我能让这个例子工作,那么剩下的只是重复它。
createBuilding: function() {
return new Promise((resolve, reject) => {
if(this.building === 'New building') {
this.$store.dispatch('newBuilding', {
address: this.address,
number_units: this.number_units
})
.catch(err => {
reject(err)
})
resolve(this.$store.getters.buildingID)
} else {
resolve(this.building)
}
})
},
onComplete: async function() {
let buildingID = await this.createBuilding()
console.log(buildingID)
alert('Success');
},
实际结果:
我看到 console.log 在未定义的情况下触发,然后警报然后等待的承诺/功能显示在 vue 开发工具中。
我怎样才能得到这个,以便我可以得到 createBuilding 方法的结果以与我的其他方法一起使用?
解决方案
这是 Promise 构造函数反模式。如果 Promise 已经存在并且可以被链接,则无需使用new Promise
。反模式为错误留下了空间,这里就是这种情况。
newBuilding
预计是异步的,但承诺会立即解决,这会导致竞争条件。
它应该是:
createBuilding() {
if(this.building === 'New building') {
return this.$store.dispatch('newBuilding',...)
.then(() => this.$store.getters.buildingID)
} else {
return Promise.resolve(this.building)
}
},
,async..await
它被简化为:
async createBuilding() {
if(this.building === 'New building') {
await this.$store.dispatch('newBuilding',...);
return this.$store.getters.buildingID
} else {
return this.building
}
},
推荐阅读
- r - R如何合并3列上的2个数据框,所有列名都不同
- networking - 物联网和计算机网络有区别吗
- pdf - 如何将多层 OpenOffice 绘图导出为多层 PDF 文件?
- php - 孤立的 PHP FPDF 阿拉伯文文本
- matlab - 将 Python 的 CVXOPT 中的线性规划问题转换为 MATLAB 的 linprog
- python - aiohttp RuntimeError: await 未与未来一起使用
- pine-script - 松树脚本 - 防止订单覆盖当前位置
- java - 在tableview组合框中将模型中的一组对象显示为字符串?
- kotlin - 使用类中的几个函数实现扩展函数 Kotlin
- scala - 在scala中,如果案例类在家庭外部类型中声明,如何调用它的通用复制函数?