0

Я создал рекурсивную функцию обещания:Javascript рекурсивного обещание застряли в бесконечном цикле

this.testFunction = Bluebird.method(function (instanceID) { 
     var object = this; 
     return object.canSsh(instanceID) 
     .then(function (sshable) { 
      if (sshable) { 
       return object.onSshable(instanceID) 
       .then(function() { 
        return Bluebird.resolve(); 
       }); 
      } 
      else { 
       return Bluebird.delay((SSH_POLLING_INTERVAL * 1000)) 
       .then(function() { 
        return object.testFunction(instanceID); 
       }); 
      } 
     }) 
     .catch(function (err) { 
      return Bluebird.reject(err); 
     }); 
    }); 

Однако, даже когда sshable становится истинной, эта функция продолжает рекурсивно происходит и в бесконечном цикле. Я ожидал, что как только я вернусь из блока sshable, он должен существовать.

+0

@Adam Я должен удалить все то блок? – user1692342

+0

Звучит так, как будто 'object.onSshable()' будет вызывать 'testFunction()'. В противном случае ваша функция больше не должна быть вызвана (но обратите внимание, что обещания из предыдущих вызовов все еще решены) – Bergi

+0

Я думаю, что это может быть разрешено сейчас. Функция, вызывающая тестовую функцию, не обрабатывала ее как обещание. Может ли это создать проблему? – user1692342

ответ

1

Даже когда sshable становится истинным, эта функция продолжает рекурсивно продолжать и продолжать в бесконечном цикле.

Невозможно воспроизвести. Кажется, что что-то еще вызывает ваш ваш testFunction, а не рекурсивный вызов от отложенного обратного вызова then.

Несмотря на это, вы можете сильно упростить функцию:

this.testFunction = function(instanceID) { 
    return this.canSsh(instanceID).then(function(sshable) { 
     if (sshable) { 
      return this.onSshable(instanceID); 
     } else { 
      return Bluebird.delay(SSH_POLLING_INTERVAL * 1000) 
      .then(this.testFunction.bind(this, instanceID)); 
     } 
    }.bind(this)) 
}; 
+0

Спасибо @ Roamer-1888, не знаете, почему вы откатили свое правильное редактирование? – Bergi

+0

У моей компьютерной карты есть проблемы, и я потерял уверенность в редактировании. –

+0

@ Bergi Не могли бы вы объяснить функцию bind? Я не смог выполнить документацию Bluebirds – user1692342

Смежные вопросы