Определение

MDN отлично объясняет, что такое обещание.

Объект Promise представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.

Синтаксис

При создании нового обещания он принимает в качестве аргумента функцию-исполнитель. Функция-исполнитель принимает два аргумента.

Первый аргумент представляет функцию, которая должна быть вызвана для выполнения обещания. Второй представляет функцию, которая будет выполняться, если обещание будет отклонено.

let myPromise = new Promise((resolve, reject) => {
   //insert condition of myPromise
   if (true) {
      resolve(`Successful`)
   } else {
      reject(`not successful`)
   }
})

Если условие истинно, выполняется функция разрешения. Если условие не выполняется, будет применен метод отклонения.

Состояния обещания Javascript

Объект Javascript Promise может находиться в одном из трех состояний: ожидающий, разрешенный или отклоненный.

Пока объект Promise еще не готов, состояние будет ожидающим. После разрешения он может перейти в состояние разрешено (успешное обещание) или в состояние отклонено (неудачное обещание).

Потом?

Если обещание выполнено успешно, что означает, что оно перешло в состояние разрешено, мы можем связать .then с объектом Promise. Метод .then() принимает в качестве параметра функцию обратного вызова. Если явно не указано иное, возвращаемое значение метода .then() - это объект Promise.

// if myPromise ends up in a resolved state, I can call myPromise.then()
myPromise.then(state => console.log(`The Promise was ${state}.`)
// This will print `The Promise was Successful.`

Ловить?

Если myPromise окажется в состоянии отклонения, нам понадобится метод .catch() для его обработки.

// if myPromise is in the rejected state, the .then() method would be skipped over and go directly to the .catch() method
myPromise.then(state => {
   console.log(`The Promise was ${state}.`
}).catch(state => {
   console.log(`The Promise ended up in the catch because it was ${state}.`
})
// if myPromise is rejected, this will print `The Promise ended up in the catch because it was not successful.`

Множественные обещания

Если вы хотите запустить несколько обещаний одновременно, вы можете использовать метод Promise.all(). Эта функция принимает в качестве аргумента массив обещаний. Возвращаемое значение - это обещание (ожидающее или разрешенное).

Promise.all([myPromise, myPromiseAgain])
.then( () => console.log("All Promises are resolved."))

Если в массиве Promises есть отклонение, будет показано сообщение об отклонении из Promise из самого раннего индекса. Более подробную статью о Promise.all() можно прочитать здесь.