2015-09-23 18 views
14

Qualcuno può dirmi se c'è una differenza tra l'utilizzo di una richiamata di errore rispetto a una funzione catch, quando si utilizza $q.promise per favore?Promises - callback degli errori contro catch

E.g. i due frammenti di codice sono funzionalmente equivalenti?

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); 

Se è così, perché usare la seconda? Sembra molto più brutto e porta a una maggiore duplicazione del codice secondo me?

+2

La seconda versione consente di portare la promessa di nuovo in uno stato deciso di continuare con la catena comunque restituendo qualcosa di diverso da un errore o una promessa respinta. –

+2

E se il gestore errori genera o restituisce una promessa respinta, verrà chiamata tre volte. –

risposta

4

Entrambi otterranno la stessa cosa, tranne che il secondo potrebbe eseguire errorHandler tre volte (anziché solo una volta). Lei ha ragione che essa porta con sé alcune duplicazione del codice, ma permette anche di trattare qualunque errore è accaduto e continuare con la vostra catena:

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

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

Grazie! Come potrei continuare con la catena per interesse? O continuerà semplicemente con la catena? – keldar

+2

@keldar devi solo restituire un nuovo 'Promise' dalla funzione di gestione degli errori, proprio come nell'esempio sopra! – Marcelo

+2

Non è necessario restituire una promessa. Puoi semplicemente restituire un valore. –

Problemi correlati