2015-02-11 13 views
10

Mam następujące skrzypce: http://jsfiddle.net/thelgevold/3uv9nnjm/6/Wykonywanie następnie po połowu

angular.module('hello',[]).controller('helloController',function($q){ 

    console.clear(); 
    function someService(){ 
     var deferred = $q.defer(); 
     deferred.reject({e:'error'}); 
     return deferred.promise; 
    } 

    function callService(){ 
     return someService().then(function(obj){ 
      console.log('first then'); 
     }). 
     catch(function(e){ 
      console.log('error1'); 
      var deferred = $q.defer(); 
      deferred.reject({e:'error'}); 
      return deferred.promise; 
     }); 
    } 

    callService().catch(function(e){ 
     console.log('error2'); 
    }).then(function(e){ 
     console.log('second then'); 
    }); 

}); 

To w zasadzie tylko szybki $ q obietnica POC. Moje pytanie brzmi: dlaczego ostatnia klauzula zostaje wywołana, gdy obietnica zostaje odrzucona? Wyjście jest w następujący sposób:

ERROR1

error2

drugą następnie

rozumiem dlaczego ERROR1/error2 są drukowane, ale myślałem, że druga następnie ciąg nie powinny być drukowane od obietnica była odrzucony. Pomyślałem, że pominie "drugie zdanie" z tego samego powodu, że pominięto "pierwszy". Jakieś myśli?

Odpowiedz

13

Zanim zaczniesz, nie rób tego:

var deferred = $q.defer(); 
deferred.reject({e:'error'}); 
return deferred.promise; 

Wykonaj:

return $q.reject({e:'error'}); 

lub korzystnie następująco:

return $q.reject(new Error('error')); 

Beware the deferred antipattern.

teraz , odpowiedź na twoje pytanie ur pytanie.


Po wywołaniu callService() pojawia się błąd i nie pojawia się nowy błąd. Zasadniczo "poradził" sobie z tym błędem, a następująca instrukcja obsługi .then() może zostać wywołana.

Kod synchroniczny odpowiednik swoim przykładzie byłoby:

function someService() { 
 
    throw { e: 'error' }; 
 
} 
 

 
function callService() { 
 
    try { 
 
    var obj = someService(); 
 
    console.log('first then'); 
 
    } catch (e) { 
 
    console.log('error1'); 
 
    throw { e: 'error' }; 
 
    } 
 
} 
 

 
var e; 
 
try { 
 
    e = callService(); 
 
} catch (e) { 
 
    console.log('error2'); 
 
} 
 

 
console.log('second then');

myślę, że jeśli spojrzeć na to w ten sposób, to ma sens.

Odpowiedni tekst w specyfikacji Promises/A + to here. Dla wszystkich zamiarów i celów, można zobaczyć obsługi catch jak samo jako onRejected obsługi:

2.2.7. następnie musi zwrócić obietnicę [3.3].

promise2 = promise1.then(onFulfilled, onRejected);

2.2.7.1. Jeśli funkcja OnFulfilled lub OnRejected zwraca wartość x, uruchom procedurę obietnicy rozwiązania [[Resolve]] (obietnica2, x).

Zasadniczo Twój obsługi onRejected jest „powrót” wartość undefined, więc obietnica produkowane przez catch() postanawia o wartości undefined.

+0

Dzięki! To ma sens – TGH

Powiązane problemy