Цепочки промисов в JavaScript

Пусть у нас есть следующий промис:

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

По завершению промиса выведем его результат в консоль:

javascriptpromise.then(
  function(result) {
    console.log(result); // выведет 'string'
  }
)

Давайте теперь не будем сразу выводить результат, а как-то изменим его и вернем через return:

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

В этом случае мы можем к результату нашего then применить еще один then, создав тем самым цепочку методов. При этом в результат следующего метода будет попадать то, что вернул через return предыдущий:

javascriptpromise.then(
  function(result) {
    return result + '!';
  }
).then(
  function(result) {
    console.log(result); // выведет 'string!'
  }
);

Таким образом можно построить цепочку какой-угодно длины:

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); // выведет 'string123'
  }
);