Cadeias de Promises em JavaScript

Suponha que temos a seguinte promise:

javascriptlet promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('string');
  }, 3000);
});

Ao finalizar a promise, vamos exibir seu resultado no console:

javascriptpromise.then(
  function(result) {
    console.log(result); // exibirá 'string'
  }
)

Agora, em vez de exibir o resultado imediatamente, vamos modificá-lo de alguma forma e retorná-lo via return:

javascriptpromise.then(
  function(result) {
    return result + '!';
  }
);

Neste caso, podemos aplicar outro then ao resultado do nosso then, criando assim uma cadeia de métodos. Dessa forma, o resultado do próximo método receberá o que foi retornado via return pelo anterior:

javascriptpromise.then(
  function(result) {
    return result + '!';
  }
).then(
  function(result) {
    console.log(result); // exibirá 'string!'
  }
);

Assim, é possível construir uma cadeia de qualquer comprimento:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).then(
  function(result) {
    return result + '3';
  }
).then(
  function(result) {
    console.log(result); // exibirá 'string123'
  }
);