【问题标题】:Vuex async methods ignore return resolve valueVuex 异步方法忽略返回解析值
【发布时间】:2019-02-06 02:52:27
【问题描述】:

所以,我正在将我的第一个 vuejs 项目重写为 nuxtjs,并且我正在将所有 api 调用重写为存储操作,当我注意到我无法从它们返回值时,除非我拒绝它们。

无论我如何尝试返回一个值,return xreturn Promise.resolve(x) 我的 promise 的结果总是未定义

我尝试了以下简单的操作:

async uselessWait(){
  setTimeout(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

当调用它时,结果总是undefined,尽管promise 正常解析

这是故意的,是错误还是只是我?

【问题讨论】:

  • 为什么需要从 Vuex 动作中返回值?我不认为这是一个好习惯。为什么不改用 Vue 商店?
  • TBH 我不需要返回值,我只是觉得它更干净,例如通过返回发送 api 调用的成功消息,而不是编码存储值并在解析时让组件读取存储的值
  • 如果您查看文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,事实证明您应该返回一个新的 Promise 实例,例如 new Promise((resolve, reject) => {}) 而不仅仅是 Promise.resolve ,你能试试这个吗?
  • @MátéWiszt 显然从一开始就设置 return new Promise() 工作......但前提是我在调用任何异步函数之前这样做,这会使事情变得有点复杂。这也让我想知道为什么return Promise.reject("whatever") 工作正常,而resolve("whatever") 却不行

标签: vue.js promise async-await vuex nuxt.js


【解决方案1】:

这将立即返回已解析的Promise

理想

async uselessWait(){
  return setTimeout(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

但是setTimeout 没有返回承诺,所以你不能这样做。

这是对 setTimeout 的一个看法。

setTimeoutPromise = (fn, delay) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        const ret = fn()
        resolve(ret)
      } catch (e) {
        reject(e)
      }
    }, delay)
  })
}

setTimeoutPromise(() => {
  console.log('ok')
}, 1000)

所以你的例子。

async uselessWait(){
  return setTimeoutPromise(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

现在 async 函数返回一个解决方案(如果您的回调抛出则拒绝)

你也可以等待而不是返回。

async uselessWait(){
  await setTimeoutPromise(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

【讨论】:

  • 好的,现在我明白了,为了让我返回 Promise.resolve(),我需要从一开始就链接承诺,而不仅仅是调用返回承诺的函数
  • 异步函数总是返回一个承诺。如果您不返回一个,则默认返回 Promise.resolve()。等待实际上只是以某种方式链接,返回值而不是将它们发送到下一个'then'
  • 如果是这种情况,异步函数内部的任何返回都不应该返回内部的值作为结果吗?
  • 是的,一个值,或者另一个承诺。异步的返回与将被发送到解析中的值相同,异常与调用拒绝相同。
  • 它返回 Promise.resolve(undefined) 因为你没有返回任何东西。你在 setTimeout 中返回的内容与 uselessWait 函数的返回无关。关于程序流程,我可能不会有,它不会阻塞。如果你不使用我建议的函数,你可以简单地从 uselessWait 返回一个 Promise,在 Promise 中设置超时,然后不是从超时返回,而是在包装它的 Promise 上调用 resolve。
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 2022-11-11
  • 2012-12-20
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 2011-09-06
相关资源
最近更新 更多