Рекурсивная функция разрешается, только если она выполняется один раз

#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 минут