2015-03-20 1 views
5

У меня возникли проблемы с пониманием базовой концепции обработки ошибок с обещаниями цепочки. Чтобы узнать правила, я написал простой пример, угадав, каким будет результат. Но, к несчастью, он не ведет себя так, как я бы это сделал. Я прочитал несколько статей о предмете, но, возможно, не могу получить детали из-за моего плохого английского языка.

Во всяком случае, вот мой код:

var promiseStart = $q.when("start"); 
    var promise1 = promiseStart.then(function() { 
      return Serviceforpromise1.get(); 
    }); 
    var promise2 = promise1.then(function(data1) 
    { 
      return Serviceforpromise2.get(data1); 
    },function(error) 
    { 
      return $q.reject(); 
    }); 
    var promiseend = promise2.then(function(data2) 
    { 
      return data2; 
    },function(error) 
    { 
      return error; 
    }); 
    return promiseend; 

Ну, я знаю, что это может быть намного лучше закодированы, но это только для этой цели. Вот код функции Serviceforpromise1:

function Serviceforpromise1() 
    { 
      ... 
      return $http.get(*whatever*).then(function (data){ 
       return data; 
      },function(error) 
      { 
       return $q.reject(); 
      }); 
    } 

Рассмотрим только случай отказа Serviceforpromise1 в. A $ q.rejec t отправляется обратно в основную цепочку, поэтому я жду обратного вызова ошибки «prom1. Then (», который будет вызван, и это сработало, как ожидалось. Я решил на примере передать ошибку «promise2 .then» поэтому в этих обратных ошибках я добавил строку возврата $ q.reject(); Но он никогда не достиг обратного вызова второй ошибки (в «promise2 .then» один), и я дон Не понимаю, почему (например, Serviceforpromise1, я вернул отклоненное обещание!)

Я буду рад глубоко понять, что здесь происходит. Спасибо за ваш Помогите.

+0

Как вы отметили, что обратный вызов ошибки 'prom2' не вызывается? Я ничего не вижу там, что скажет вам, вызвано ли это. – JLRishe

+0

Да, я вхожу в консоль, но удаляю код регистрации для сообщения, чтобы не беспокоиться о несущественных строках. –

ответ

6

Ваше понимание верное, и проблема, кажется, лежит где-то в том, как вы пытаетесь наблюдать за этим поведением (в том, что вы не показали нам).

Если вы возвращаете отвергнуто обещание от либо успеха или обработчика ошибок в then(), то обещание, возвращаемое then() рассосется отклоненным обещание. Обратите внимание:

angular.module('app', []) 
 
    .controller('C', [ 
 
    '$q', 
 

 
function ($q) { 
 
    var promiseStart = $q.when("start"); 
 
    var promise1 = promiseStart.then(function (value) { 
 
     console.log('Got a value:', value); 
 
     return $q.reject('Error!'); 
 
    }); 
 

 
    var promise2 = promise1.then(function (data1) { 
 
     return "Got some stuff"; 
 
    }, function (error) { 
 
     console.log("Caught an error:", error); 
 
     return $q.reject('New error'); 
 
    }); 
 

 
    var promiseend = promise2.then(function (data2) { 
 
     return data2; 
 
    }, function (error) { 
 
     console.log('Caught an error:', error); // <-- this is logged to the console 
 
     return error; 
 
    }); 
 

 
    return promiseend; 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script> 
 
<div ng-app='app' ng-controller='C'></div>

Одна вещь, чтобы отметить здесь, что в этом последнем обработчике, вы возвращение переменную error, а не бросать исключение или возвращение отклоненного обещания. Таким образом, в этом случае promiseend будет успешно решить со значением error переменной.

+0

Спасибо за ответ. Меня успокаивают с одной стороны, но беспокоят друг друга. Вы, например, отлично работаете. Я попытаюсь вырезать и вставить ваш код и заменить каждую строку моей, чтобы найти свою ошибку. Я вернусь с комментариями. спасибо –

+0

** Обновление **: хорошо, что вы были правы JLRishe. Это была опечатка, которую я исправил, когда написал свой пример в stackoverflow, оставив ошибку в моем исходном коде. Спасибо, что указал мне на это, и спасибо за то, что подтвердили мою гассу. –

+0

@JLRishe Есть ли причина, по которой вы возвращаете данные об ошибках как успешные? Из того, что я понимаю, отклоненные обещания не останавливают выполнение JavaScript.Мне просто интересно, потому что я все еще получаю обещания, и, похоже, вы могли бы сделать это в любом случае. – Usagi

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

  • Нет связанных вопросов^_^