JavaScript Encadenamiento de promesa


Ejemplo

La then método de una promesa devuelve una nueva promesa.

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 */ });

Devolver una Promise de una devolución de llamada en then agregará a la cadena de promesa.

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 */ });

Una catch permite que una promesa rechazada se recupere, de manera similar a cómo funciona la catch en una declaración de try / catch . Cualquier encadenado then una catch ejecutará su controlador de resolución utilizando el valor resuelto de la catch .

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

Si no hay catch o reject en el medio de la cadena, una catch al final capturará cualquier rechazo en la cadena:

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

En ciertas ocasiones, es posible que desee "ramificar" la ejecución de las funciones. Puede hacerlo devolviendo diferentes promesas desde una función dependiendo de la condición. Más adelante en el código, puede combinar todas estas ramas en una para llamar a otras funciones y / o para manejar todos los errores en un solo lugar.

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

Así, el orden de ejecución de las funciones se ve así:

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

La catch única obtendrá el error en cualquier rama que pueda ocurrir.