При создании экземпляра промиса мы все передаем функцию — эта функция является исполнителем для этого экземпляра промиса. Или, другими словами, экземпляры промисов принимают в качестве аргумента метод, называемый исполнителем.

new Promise(executor)

Исполнитель промиса executor принимает в качестве аргументов два метода: resolve и reject.

Внутри исполнителя, если вызывается разрешение, экземпляр Promise становится выполненным.

const executor = (resolve, reject) => {
  setTimeout(() => resolve("I'm resolving"), 1000);
};

new Promise(executor).then(result => {
  console.log(result);
  // Output after 1000ms: I'm resolving
});

Если возникает исключение, вместо этого вызывается reject, и экземпляр Promise становится отклоненным.

const executor = (resolve, reject) => {
  setTimeout(() => reject(new Error("I'm rejecting")), 1000);
};

new Promise(executor).catch(error => {
  console.log(error.message);
  // Output after 1000ms: I'm rejecting
});

Таким образом, промисы улучшают поток кода и гибкость. Но есть еще кое-что. Следите за мной и следите за обновлениями!