Жду жду обещание позвони сама
Рассмотрим этот код:
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 ()