Con javascript 2015 si ha la possibilità di utilizzare nativamente le promise.
Le promesse sono un costrutto particolare introdotto in parte per evitare uno degli scenari più comuni, in cui ci si imbatte quando si ha a che fare con molte chiamate asincrone dipendenti l’una dall’altra. Il cosiddetto callbacks hell, inferno di callbacks.

Su un piano pratico, concatenare le promise è un pò come concatenare le callbacks, solo, in modo molto più elegante.
Facendolo siamo in grado di rendere un flusso d’esecuzione asincrono, sincrono.

Si consideri ad esempio il metodo seguente:

let calculate = function (value) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(value + 1);
        }, 0);
    });
};

Ora immaginiamo di voler richiamare questo metodo 4 volte, e ogni volta di voler passare il risultato della chiamata precedente alla successiva. (Questo in un certo senso simula ad esempio più chiamate HTTP verso delle API, tutte dipendenti l’una dall’altra per recuperare ogni singola informazione necessaria al rendering della pagina stessa).
Con le promesse, questa serie di chiamate ha una forma di questo tipo:

calculate(1)
    .then(calculate)
    .then(calculate)
    .then(calculate)
    .then(verify);
 
function verify(result) {
    expect(result).toBe(5);
    done();
};

Il codice sopra (con Jasmine) verifica anche che il valore finale ottenuto sia 5, perchè il metodo compute di fatti aggiunge 1 ad ogni invocazione. Il codice funziona perchè ogni chiamata al metodo “then” di una promise restituisce una promise a sua volta. Potrete pensare che questo succede perchè è il metodo calculate a restituire una nuova promise, ma in realtà verrà restituita una promise anche se la funzione passata non produce e restituisce esplicitamente una promise.
Come esempio, sostituiamo una chiamata al metodo con una funzione che semplicemente restituisce result + 1.

calculate(1)
    .then(calculate)
    .then(result => result + 1)
    .then(calculate)
    .then(verify);
 
function verify(result) {
    expect(result).toBe(5);
    done();
};

Il risultato del codice sopra è sempre il valore 5, e l’oggetto restituito dalla chiamata con la funzione freccia (vedi ES6) è sempre una promise, perchè è il metodo then che si assicura che il valore di ritorno sia “racchiuso” in una promise. Se la funzione non restituisce un valore esplicitamente, la nuova promise restituirà di default il valore undefined.

Semplice come appare.