Определение
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()
можно прочитать здесь.