Жду жду обещание позвони сама

Рассмотрим этот код:

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

Если число четное, мы вызываем новое обещание, когда число нечетное, мы разрешаем обещание, но после некоторых четных чисел и после разрешения ожидание никогда не возвращается,

Есть идеи, как это решить?

Спасибо,

Bigs

1 ответ

Проблема в том, что вам всегда нужно звонить resolve или же reject когда вы создаете обещание. В вашем четном случае вы возвращаете результат promiseEvenOdd, но вы никогда не разрешите первоначальное обещание, поэтому оно навсегда висит.

Чтобы это исправить, вы должны просто разрешить исходное обещание с помощью результата рекурсивного вызова, а не возвращать его. Например, изменить линию

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

Другие вопросы по тегам