【问题标题】:how to get the return value of an async function after then is called on the async function在异步函数上调用之后如何获取异步函数的返回值
【发布时间】:2020-11-20 13:15:59
【问题描述】:

Promise 看起来非常直接。但是每次遇到它,我都必须做一些变通方法,而实际上我只想同步执行一个函数。

我想知道我是否以某种方式错过了如何正确地做到这一点,因为它应该如何工作似乎很明显。

想象一下下面的代码

getData()
.then(data => {
  const dates = [];
  generateDates(30, new Date(), dates)
  .then(result => {
    console.log(result)
  })
})

generateDates() 的 promise 在日期数组完成填充之前被解析,因此 console.log() 返回 undefined。

为什么在函数返回之前调用 generateDates() 上的 then()?该函数应仅在日期数组完全填充后返回。这样的承诺对我来说没有意义。

const generateDates = async(n, date, dates) => {
  if (n === 0) {
    return dates;
  }
  dates.push(date);
  n--;
  date = date - (30 * 24 * 60 * 60 * 1000)
  generateDates(n, date, dates);
}

【问题讨论】:

  • 我看不到 generateate 是一个异步函数。
  • const generateDates(n, date, dates) { 是一个语法错误,甚至不返回承诺(也不应该返回),所以我根本看不出generateDates(…).then(…) 是如何工作的。
  • "在调用之后如何获取异步函数的返回值" - 你在then回调内部得到它,而不是通话后。 “事实上,我只希望一个函数同步执行”——如果该函数执行异步操作,那么你就是在要求不可能的事情。拥抱异步,总是从这些函数中返回一个承诺,它会变得简单明了。尤其是async/await 语法。
  • @lissettdm 对不起,致命的错字。整个签名都搞砸了
  • 因为 generateDates 是一个递归函数,你必须返回递归调用。返回它将使结果成为数组值而不是未定义。

标签: javascript es6-promise


【解决方案1】:

问题不在于 generateDates 在日期完成填充之前已解决,而是因为没有返回递归调用。

 const getData = async() => {};

 const generateDates = async(n, date, dates) => {
      if (n === 0) {
        return dates;
      }
      dates.push(date);
      n--;
      date = date - (30 * 24 * 60 * 60 * 1000)
      return generateDates(n, date, dates);
    }

    const dates = [];
    getData().then(data => {
      const dates = [];
       generateDates(2, new Date(), dates).then(result =>        console.log(result))

    })
   

【讨论】:

  • 它发生了。很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2021-01-09
  • 2020-07-29
  • 2020-03-09
相关资源
最近更新 更多