2015-09-27 16 views
5

Ho avuto confusione sulla catena Promise in ES6.Informazioni sulla catena Promise in ES6

function taskA() { 
 
    console.log("Task A"); 
 
    throw new Error("throw Error @ Task A") 
 
} 
 

 
function taskB() { 
 
    console.log("Task B"); 
 
} 
 

 
function onRejected(error) { 
 
 console.log(error);// => "throw Error @ Task A" 
 
} 
 
    
 
function finalTask() { 
 
    console.log("Final Task"); 
 
} 
 

 
var promise = Promise.resolve(); 
 
promise 
 
.then(taskA) 
 
.then(taskB) 
 
.catch(onRejected) 
 
.then(finalTask);

Cosa mi sono perso qui è per questo che si chiamerà finalTask? La catena catch() restituisce una promessa risolta?

+0

possibile duplicato di [Chained promises not passing on rejection] (http://stackoverflow.com/q/16371129/1048572) – Bergi

risposta

13

Quando si fornisce un gestore .catch() o il secondo argomento per .then(), la promessa respinta è stata "gestita". Per impostazione predefinita, quando si fornisce tale gestore di rifiuto, il sistema di promessa presuppone che il rifiuto sia stato gestito e che la catena continui.

Se non si desidera continuare la catena, quindi dal gestore di rifiuto, è possibile restituire una promessa respinta o generare un errore. Ciò interromperà la catena fino a quando un altro respinge il gestore della catena.

Così, qui sono le possibilità di una catena come si mostrano:

1) Non v'è alcun rifiutano gestore della catena

La catena si arresta completamente e non oltre .then() soddisfare i gestori vengono eseguiti .

2) C'è un gestore di rifiuto nella catena che non restituisce nulla o restituisce un valore normale o una promessa soddisfatta o una promessa che alla fine soddisfa.

Questo è ciò che il codice attualmente mostra. Lo scarto è considerato gestito e lo stato di promessa della catena si trasforma in una promessa soddisfatta, così vengono chiamati i successivi gestori di adempimenti nella catena.

3) C'è uno scarto gestore della catena che sia restituisce una promessa respinta o genera un errore

Tornando alla promessa rifiutato (o una promessa che rifiuta in futuro) o lanciare un nuovo errore (che viene trasformato in promessa respinta) interromperà l'ulteriore elaborazione della catena fino al prossimo gestore di errori.

Quindi, se hai cambiato onRejected() gestore per questo:

function onRejected(error) { 
  console.log(error); 
    throw error; // rethrow error to stop the rest of the chain 
} 

Poi, la catena promessa si fermava lì.


È importante capire perché funziona in questo modo. Ciò consente di gestire un errore nel mezzo della catena di promesse e il codice che gestisce l'errore arriva a decidere se la catena continua o meno in base a ciò che restituisce o genera. Se restituisce nulla o un valore normale o una promessa soddisfatta, l'elaborazione della catena continua - l'errore è stato gestito - non è necessario interrompere l'ulteriore elaborazione.

Tuttavia, se l'errore è più grave di quello e l'elaborazione non deve continuare, il gestore di rifiuti può lanciare lo stesso errore o lanciare un errore diverso o restituire una promessa rifiutata e la catena salterà i gestori di adempiere fino a il successivo gestore di rifiuti nella catena.

+1

Grazie mille! La tua spiegazione è abbastanza chiara. – JasmineOT

+2

È abbastanza analogo a 'catch' in sincrono' try {} catch (e) {} 'in questo modo (l'errore viene gestito a meno che non venga rethrown). – jib