Q Обещание разрешить / отклонить логику - почему обещание не возвращается как отклоненное?

Новое для обещаний, пытаясь понять логику потока. Думал, что понял, пока не начал вставлять ошибки для проверки. В приведенном ниже примере, когда я закомментирую 3-ю строку, почему Reject не возвращается в обещании?

var Q = require( "q" )

var getInstallBase = function() {
     return new Promise(function(resolve, reject) { 
 //var IBdata = 'temp IBdata'; // <------comment out so IBdata not defined
     if (IBdata){
            resolve(IBdata); // State will be fulfilled
        } else {
     reject("error getting IBdata"); // State will be rejected             
        }
     });
}

var mungeIt = function(IBdata){
    return new Q.Promise(function(resolve,reject){
  // get insight from data
  console.log('IBdata = ' + IBdata);
  var insight = 'temp insight';
        if (insight){
            resolve(insight); // State will be fulfilled
        } else {
            reject("error getting insight"); // State will be rejected
        }
    })
}

var postResults = function(insight) {
 return new Promise(function(resolve, reject) {
  console.log('insight = ' + insight);
  // post result
  var objectID = '12345';
  if (objectID){
   setTimeout(function() {
    console.log('done waiting');
    resolve(objectID);
   }, 2000);
    // State will be fulfilled
  } else {
   reject("error posting insight to object store"); // State will be rejected
  }
 });
};

(function extractInsightCycle() {
 getInstallBase().then(mungeIt).then(postResults).then(function(objectID) {
  console.log('object successfully posted, ID: ' + objectID)
  extractInsightCycle();
 }).catch(function(error) {
  console.log('something went wrong', error);
  extractInsightCycle();
 })
} )();

1 ответ

Пожалуйста, проверьте этот JSBin: http://jsbin.com/zutotuvomo/edit?js,console

Он содержит упрощенную версию вашего кода, и, как вы можете видеть, обещание вернулось из getInstallBase действительно отвергает.

Возможно, что-то еще в вашем коде заставляет его выглядеть так, как будто оно не отвергает.

РЕДАКТИРОВАТЬ:

Я еще раз взглянул на код, и вот что происходит - отклоненное обещание ловится:

function(error) {
    console.log('something went wrong', error);
    extractInsightCycle();
}

Который называет extractInsightCycle это функция, которая инициирует весь процесс, и это вызывает бесконечный цикл (фактически, бесконечную рекурсию).

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