#javascript #recursion #promise
#javascript #рекурсия #обещание
Вопрос:
У меня есть рекурсивная функция, которая вызывает саму себя. Поскольку она находится в обещании, когда я вызываю ее снова, обещание связывается, и кажется, что я не могу выйти, даже если я возвращаю его. Вот моя функция…
let depth = 0;
const maxDepth = 1;
main();
function main()
{
reccursive.then(
function(response)
{
console.log('all finished!');
});
}
function reccursive()
{
return new Promise((resolve, reject)=>
{
console.log('in recursive function');
if (depth === maxDepth)
{
console.log('hit max depth');
return resolve();
}
console.log('not max depth, increasing');
depth ;
return reccursive();
});
}
Если максимальная глубина равна 0, она будет запущена один раз, а затем разрешится просто отлично.
Комментарии:
1. Вы никогда не разрешаете обещание внутри рекурсивной функции. Вам нужно просто вызвать
resolve()
, а неreturn resolve()
.2. Я выполняю return resolve(); который разрешил бы обещание, не так ли? И когда я вызываю ее снова, я возвращаю любое значение, которое она возвращает, в данном случае разрешение.
3. хорошо, я попробую это, одну секунду
4. Вы разрешаете только «самое глубокое» обещание. При каждом вашем вызове
new Promise
также должен быть 1 вызовresolve()
. Хотя это очень плохой способ реализовать это. Не используйтеnew Promise()
.5. я убрал возврат, и это не сработало. Как еще я мог бы выполнить обещание, если я не выполняю новое обещание?
Ответ №1:
Вопрос в том, нужно ли создавать несколько обещаний? Если нет, то создайте одно обещание и создайте внутреннюю функцию, которая действует как рекурсивная функция.
function recursive(depth = 0, maxDepth = 5)
{
console.log('in recursive function');
function inner(resolve){
if (depth === maxDepth){
console.log('hit max depth');
resolve(depth);
return;
}
console.log('not max depth, increasing');
depth ;
inner(resolve);
}
return new Promise((resolve, reject)=>{
inner(resolve);
});
}
recursive().then(depth=>console.log(depth))
Ответ №2:
вам не хватает разрешения для первого вызова. вместо return reslove()
использования reccursive().then(function(){ resolve();});
let depth = 0;
const maxDepth = 1;
main();
function main()
{
reccursive.then(
function(response)
{
console.log('all finished!');
});
}
function reccursive()
{
return new Promise((resolve, reject)=>
{
console.log('in recursive function');
if (depth === maxDepth)
{
console.log('hit max depth');
return resolve();
}
console.log('not max depth, increasing');
depth ;
reccursive().then(function(){ resolve();});
});
}
Комментарии:
1. Спасибо, это работает. Я изменил ее abit и вместо этого выполнил reccursive().then(resolve);. Спасибо, я могу принять это через 5 минут