Последовательное выполнение функций

by Artem

HTML

<div id="log"></div>

JavaScript

'use strict';

function myFunc1(resolve, reject) {
  setTimeout(function() {
    resolve();
  }, 3000);
}

function myFunc2(resolve, reject) {
  setTimeout(function() {
    resolve();
  }, 5000);
}

function myFunc3(resolve, reject) {
  setTimeout(function() {
    resolve();
  }, 2000);
}

function log(text) {
  let logElement = document.getElementById('log');
  logElement.innerHTML += '<br />' + text;
}

function sequence(fns) {
  let chain = Promise.resolve();
  fns.forEach(function(fn) {
    chain = chain.then(function() {
      return new Promise(function(resolve, reject) {
        log('started execution at: ' + new Date().toTimeString());
        fn(resolve, reject);
      }).then(function() {
        log('stopped execution at: ' + new Date().toTimeString());
      });
    });
  })
  return chain;
}
sequence([myFunc1, myFunc2, myFunc3]);