2015-09-23 23 views
14

Czy ktoś może mi powiedzieć, czy jest różnica między korzystaniem z funkcji oddzwaniania błędu a funkcją catch, jeśli korzystasz z numeru $q.promise?Obietnice - błąd oddzwaniania w porównaniu do przechwytywania

E.g. są dwa fragmenty kodu funkcjonalnie równoważne?

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

doSomething0() 
    .then(doSomething1) 
    .then(doSomething2) 
    .then(doSomething3) 
    .catch(function (err) { 
     // do something with `err` 
    }); 

vs.

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

function errorHandler(err) { 
    // do something with `err` 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 

Jeśli tak, to dlaczego korzystać z drugą? Wygląda o wiele brzydiej i moim zdaniem prowadzi do większej duplikacji kodu?

+2

Druga wersja pozwala na dostosowanie obietnicę powrotem do uchwalonej stanie kontynuować w każdym razie, zwracając cokolwiek poza błędem lub odrzuconą obietnicą. –

+2

A jeśli program obsługi błędów wyrzuci lub zwróci odrzuconą obietnicę, zostanie wywołany trzy razy. –

Odpowiedz

4

Oba osiągną to samo, z wyjątkiem tego, że drugi może działać trzy razy (zamiast tylko raz). Masz rację, że przynosi jakąś powielania kodu, ale również pozwala traktować niezależnie od błędu stało i kontynuować łańcucha:

function errorHandler(err) { 
    //log error, continue 
    return $q.resolve('default value or something'); 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 
+0

Dziękujemy! Jak powinienem kontynuować łańcuch zainteresowania? A może po prostu kontynuować z łańcuchem? – keldar

+2

@keldar wystarczy, że zwrócisz nową 'Promise' z funkcji obsługi błędów, tak jak w powyższym przykładzie! – Marcelo

+2

Nie trzeba zwracać obietnicy. Możesz po prostu zwrócić wartość. –