Cose importanti da capire qui
Entrambe le funzioni thene catchrestituiscono nuovi oggetti promessa.
Lanciare o rifiutare esplicitamente, sposterà la promessa attuale allo stato rifiutato.
Poiché thene catchrestituiscono nuovi oggetti promessa, possono essere concatenati.
Se lanci o rifiuti all'interno di un gestore di promesse ( theno catch), verrà gestito nel successivo gestore di rifiuto lungo il percorso di concatenamento.
Come indicato da jfriend00, i gestori thene catchnon vengono eseguiti in modo sincrono. Quando un gestore lancia, finirà immediatamente. Quindi, lo stack verrà srotolato e l'eccezione andrebbe persa. Ecco perché lanciare un'eccezione rifiuta l'attuale promessa.
Nel tuo caso, stai rifiutando dentro do1lanciando un Erroroggetto. Ora, la promessa attuale sarà in stato respinto e il controllo verrà trasferito al gestore successivo, che è thennel nostro caso.
Poiché il thengestore non ha un gestore di rifiuto, do2non verrà eseguito affatto. Puoi confermarlo usando console.logal suo interno. Poiché la promessa corrente non ha un gestore di rifiuto, verrà rifiutata anche con il valore di rifiuto della promessa precedente e il controllo verrà trasferito al gestore successivo che è catch.
Come catchè un gestore di rifiuto, quando lo fai console.log(err.stack);al suo interno, sei in grado di vedere la traccia dello stack degli errori. Ora, stai lanciando un Erroroggetto da esso, quindi anche la promessa restituita catchsarà in stato rifiutato.
Poiché non è stato collegato alcun gestore di rifiuto a catch, non è possibile osservare il rifiuto.
Puoi dividere la catena e capirlo meglio, in questo modo
var promise = do1().then(do2);
var promise1 = promise.catch(function (err) {
console.log("Promise", promise);
throw err;
});
promise1.catch(function (err) {
console.log("Promise1", promise1);
});
L'output che otterrai sarà qualcosa di simile
Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }
All'interno del catchgestore 1, stai ottenendo il valore promisedell'oggetto come rifiutato.
Allo stesso modo, anche la promessa restituita dal catchgestore 1 viene respinta con lo stesso errore con il quale è promisestata rifiutata e la osserviamo nel secondo catchgestore.
.catch(…)ritorna.