【问题标题】:Vue method not accepting async/awaitVue 方法不接受异步/等待
【发布时间】:2021-05-11 17:23:37
【问题描述】:

我正在开发一个 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 以 undefined 触发,然后警告和等待的 promise/function 显示在 vue 开发工具中。

我怎样才能得到这个,以便我可以得到 createBuilding 方法的结果以与我的其他方法一起使用?

【问题讨论】:

    标签: javascript vue.js vuex


    【解决方案1】:

    这是 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
        }
    },
    

    【讨论】:

    • 谢谢,我试了一下,我看到吸气剂在其他任何事情包括等待调度之前就开始了。我已经搜索了我的代码,看看它是否在其他地方被调用,但不是。任何想法为什么仍然会发生这种情况?我还看到 buildingID 的 console.log 在操作实际发生之前触发。
    • 看到 getter 在其他任何事情发生之前就启动了,这包括调度的等待 - 你是如何确定这一点的?请提供可以重现问题的stackoverflow.com/help/mcve。可能是操作或其他任何错误。
    • 我不确定如何重现该问题,因为我不确定问题出在哪里。无论哪种方式,我认为我通过使操作 async/await 并在 axios.post 上执行 await 来解决它。您的答案和操作更改的组合似乎已经解决了它,即使它引入了奇怪的 getters 错误。至于确定它是如何首先触发的,大量的 console.log 和带有描述的时间戳
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多