2013-10-25 19 views
15

Finalmente ho avuto angolare movimentazione verso il basso errore di promessa, ma era contro-intuitivo per me. Mi aspettavo che gli errori venissero gestiti dal callback degli errori, ma invece dovevo usare un problema.In Angular, qual è la differenza concettuale tra l'errore e le funzioni catch per le promesse?

io non capisco il motivo per cui concettualmente il pescato viene eseguito piuttosto che la richiamata fallimento.

Quello che mi aspettavo:

SomeAsyncService.getData().then(function (result) { 
    // The call is successful. 
    // Code in this block throws an error. 
}, function (error) { 
    // I expected to handle errors here. 
}); 

Che alla fine ha funzionato.

SomeAsyncService.getData().then(function (result) { 
    // The call is successful. 
    // Code in this block throws an error. 
}).catch(function (error) { 
    // Where the error is actually caught. 
}); 

Se esiste un modo più appropriato per gestire gli errori di promessa, fatemi sapere.

risposta

16

Il secondo argomento non dovrebbe quasi mai essere utilizzato letteralmente nel codice dell'applicazione mentre si utilizza anche il primo. Si tratta principalmente di promettere l'interoperabilità delle librerie tra diverse implementazioni.

È consigliabile utilizzare sempre .catch a meno che non si disponga di uno strano caso d'angolo dove è necessario il numero .then(succcess, fail).

Vedere The .then(success, fail) anti-pattern.

Inoltre libreria Q (Quello $ angolare q si riferiscono al) has similar section in their readme

-1

Con angularJS documentation for $q:

Metodi

allora (successCallback, errorCallback, notifyCallback) - indipendentemente dalla quando la promessa è stata o sarà risolto o rifiutata, allora chiama uno del successo o del errore callback in modo asincrono non appena il risultato è disponibile.

.....

catch (errorCallback) - scorciatoia per promise.then (null, errorCallback)

I due pezzi di codice che avete inviato sono identiche.

+0

La prima non cattura errori, il secondo fa. – Jason

7

penso che tu sia un po 'equivoco come promette il lavoro.

Nel primo blocco di codice non v'è un solo oggetto promessa ed è SomeAsyncService.getData(). L'errorCallback non è chiamato qui perché quella promessa è stata risolta.

Nel secondo blocco di codice non ci sono in realtà oggetti 2 promessa si sta lavorando con. Si noti che .then() "restituisce una nuova promessa che si risolve o rifiutato tramite il valore di ritorno del successCallback, errorCallback". Quindi, quello che sta succedendo è che stai ricevendo l'errore dalla seconda promessa restituita da SomeAsyncService.getData().then(...).

+0

Sarebbe corretto dire che il callback di errore viene eseguito solo se la promessa immediatamente precedente fallisce ma il catch viene eseguito se qualche promessa nella catena genera un errore? – Jason

+0

Sei parzialmente corretto. Catch verrà eseguito se una precedente promessa nella catena genera un errore e tale errore non è già stato gestito. –

Problemi correlati