js等待promise调用本身

时间:2018-07-09 17:31:06

标签: javascript promise async-await resolve

考虑以下代码:

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 ()

如果数字为偶数,我们将其称为新的诺言;当数字为奇数时,我们将兑现诺言;但是,在某些偶数之后,并且在解决之后,永远不会返回等待,

有什么解决办法的想法吗?

谢谢

大个子

1 个答案:

答案 0 :(得分:1)

问题在于,创建承诺时,您始终必须致电resolvereject。在偶数情况下,您返回promiseEvenOdd的结果,但是您从未解决原始的诺言,这就是它永远挂起的原因。

要解决此问题,您应该仅使用递归调用的结果来解决原始的promise,而不要返回它。例如,更改行

return promiseEvenOdd()

收件人:

resolve(promiseEvenOdd())

这样,第一个承诺将与下一个承诺的结果一起解决。

示例:

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 ()