JavaScript Chaîne de promesse


Exemple

La méthode then d'une promesse renvoie une nouvelle promesse.

const promise = new Promise(resolve => setTimeout(resolve, 5000));

promise
    // 5 seconds later
    .then(() => 2)
    // returning a value from a then callback will cause
    // the new promise to resolve with this value
    .then(value => { /* value === 2 */ });

De retour d' une Promise d'un then rappel ajoutera à la chaîne de promesse.

function wait(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

const p = wait(5000).then(() => wait(4000)).then(() => wait(1000));
p.then(() => { /* 10 seconds have passed */ });

Un catch permet à une promesse rejetée de récupérer, similaire à la manière dont catch dans une instruction try / catch fonctionne. Tout enchaînée , then après une catch exécutera son gestionnaire de résolution en utilisant la valeur résolue de la catch .

const p = new Promise(resolve => {throw 'oh no'});
p.catch(() => 'oh yes').then(console.log.bind(console));  // outputs "oh yes"

S'il n'y a pas catch ou reject les gestionnaires au milieu de la chaîne, une catch à la fin capturera tout rejet dans la chaîne:

p.catch(() => Promise.reject('oh yes'))
  .then(console.log.bind(console))      // won't be called
  .catch(console.error.bind(console));  // outputs "oh yes"

Dans certaines occasions, vous pouvez vouloir "brancher" l'exécution des fonctions. Vous pouvez le faire en renvoyant différentes promesses d'une fonction en fonction de la condition. Plus loin dans le code, vous pouvez fusionner toutes ces branches en une seule pour y appeler d'autres fonctions et / ou traiter toutes les erreurs en un seul endroit.

promise
    .then(result => {          
        if (result.condition) {
            return handlerFn1() 
                .then(handlerFn2);
        } else if (result.condition2) {
            return handlerFn3()
                .then(handlerFn4);
        } else {
            throw new Error("Invalid result");
        }
    })
    .then(handlerFn5)
    .catch(err => {
        console.error(err);
    });

Ainsi, l'ordre d'exécution des fonctions ressemble à ceci:

promise --> handlerFn1 -> handlerFn2 --> handlerFn5 ~~> .catch()
         |                            ^
         V                            |
         -> handlerFn3 -> handlerFn4 -^            

La catch unique aura l'erreur sur n'importe quelle branche.