【问题标题】:js await promise call itselfjs await 承诺调用本身
【发布时间】:2018-07-09 17:31:05
【问题描述】:

考虑这段代码:

async function callPromise ()
{
    let num = await promiseEvenOdd()
    console.log(num, "is odd")
}

function promiseEvenOdd()
{
    return new Promise((resolve, reject) => {
        let num = Math.floor(Math.random() * 2) + 1
        console.log("num", num)  
        if (num % 2)
        {
            console.log("odd")
            resolve(num)
        }
        else
        {
            console.log("even")
            return promiseEvenOdd()
        }

      })
}

callPromise ()

如果数字是偶数我们调用一个新的承诺,当数字是奇数我们解决承诺,但在一些偶数之后,并且在解决之后,等待永远不会返回,

知道如何解决吗?

谢谢,

大佬

【问题讨论】:

  • 你为什么还要在这里使用 Promise?没有异步操作。如果你只想要一个奇数随机数,你可以创建一个循环并直接返回随机数。
  • 更详细地查看您的代码,更难弄清楚您要做什么。 Math.floor(Math.random() * 2) + 1x1 <= x < 3 之间生成一个随机数,因此它可以生成的唯一值是12,因此其中唯一的奇数是1。所以,你想随机生成一个1?没有意义。
  • 哈哈这只是一个关于承诺的例子,而不是关于随机的:-))
  • CRice 解决了我的问题,我认为当你问什么的时候最好隔离一下,这就是我创建这段假代码的原因
  • 假代码不会在堆栈溢出问题上为您提供最佳答案,因为当您不向我们展示您的真实代码时,我们无法理解整个问题并为您提供解决问题的最佳方法以你从未想过要问的方式来解决问题。因此,为了对您甚至不知道要询问的事情提供最佳帮助,我们必须查看您的真实代码。

标签: javascript promise async-await resolve


【解决方案1】:

问题是,当你创建一个 promise 时,你总是需要调用 resolvereject。在偶数情况下,您返回 promiseEvenOdd 的结果,但您从未解决原始承诺,这就是它永远挂起的原因。

要解决这个问题,您应该只使用递归调用的结果来解决原始承诺,而不是返回它。例如,换行

return promiseEvenOdd()

到:

resolve(promiseEvenOdd())

这样,第一个 Promise 将使用下一个 Promise 的结果来解决。

例子:

async function callPromise ()
{
    let num = await promiseEvenOdd()
    console.log(num, "is odd")
}

function promiseEvenOdd()
{
    return new Promise((resolve, reject) => {
        let num = Math.floor(Math.random() * 2) + 1
        console.log("num", num)  
        if (num % 2)
        {
            console.log("odd")
            resolve(num)
        }
        else
        {
            console.log("even")
            resolve(promiseEvenOdd())
        }

      })
}

callPromise ()

【讨论】:

  • 非常感谢,但现在我想在 EventEmitter.on 函数中解决这个承诺,你认为有可能吗?
  • 这当然是可能的,但我不能在没有看到你如何尝试的情况下给出任何细节。您能否编辑您的问题以包括您尝试以这种方式使用它?
  • 感谢您的帮助 CRice,它就像一个魅力,祝您有美好的一天!
  • 这看起来像是Promise constructor antipattern 的边界。
  • 这是我试图解决的问题的完美解决方案。谢谢,Crice。
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 2021-12-01
  • 1970-01-01
  • 2018-01-05
  • 2021-03-08
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多