Что такое обещание
Определение MDN — объект Promise
представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.
Обещание в javascript похоже на обещание в реальной жизни.
- Обещание в javascript и в реальной жизни — это соглашение, которое устанавливает ожидание того, что что-то будет сделано.
- Обещание можно либо сдержать, либо нарушить.
- Когда обещание нарушено, вы ожидаете выяснить, почему обещание не удалось сдержать, чтобы принять меры.
- Когда обещание сдержано, вы ожидаете получить обещанное.
В чем смысл Promise в Javascript и как это работает
Промисы в основном используются для упрощения обработки асинхронных операций или блокировки кода, например вызовов API и вызовов базы данных.
У обещания в javascript есть три статуса.
- Ожидание = начальное состояние обещания.
- Resolved = состояние обещания, представляющее успешную операцию (например, обещание было сохранено.
- Отклонено = состояние обещания, представляющее неудачную операцию.
Как создать обещание
Ниже приведен синтаксис, необходимый для создания нового промиса.
new Promise(function(resolve, reject) { ... } );
Пример 1
- В этом примере я создал переменную с именем «TheSecretWasKept» и установил для нее значение true.
- Затем я создал новое обещание, которое проверяет, был ли сохранен секрет или нет.
var TheSecretWasKept = true; secret = new Promise(function(resolve, reject) { if (TheSecretWasKept) { resolve("I can trust this person with my secrets"); } else { reject("I cant trust this person with my secrets. "); } }); console.log(secret);
Пример 1. Результат
- Как видите, обещание было выполнено, и в консоли оно отображается как «разрешено».
- В консоли также отображается значение выполненного обещания.
Пример 2
А теперь, поскольку я установил для переменной «TheSecretWasKept» значение false…
var TheSecretWasKept = false; secret = new Promise(function(resolve, reject) { if (TheSecretWasKept) { resolve("I can trust this person with my secrets"); } else { reject("I cant trust this person with my secrets. "); } }); console.log(secret);
Пример 2 Результат
… Консоль показывает, что обещание отклонено.
Обещание методов прототипа
- Методы промисов — это способ связать ваш код в цепочку на основе успеха или неудачи выполнения промиса.
- Методы будут запущены на основе результата обещания.
- Это более простой и чистый способ связать ваш код вместе без использования обратных вызовов, которые могут запутаться и привести к аду обратных вызовов.
- Существует три типа методов прототипирования обещаний.
потом
- Метод, который оживает, если обещание сдержано.
Поймать
- Это метод, который оживает, если обещание не выполнено.
наконец-то
- Это метод, который выполняется независимо от результата.
Пример истории
- В этом примере обещание было создано с обещанием матери купить телефон для своего сына.
- Я создал 3 метода прототипа обещания, чтобы реагировать на результаты обещания.
var momsPromise = new Promise(function(resolve, reject) { momsSavings = 20000; priceOfPhone = 60000; if (momsSavings > priceOfPhone) { resolve({ brand: "iphone", model: "6s" }); } else { reject("We don't have enough savings. Let us save some more money."); } }); momsPromise.then(function(value) { console.log("Hurray I got this phone as a gift ", JSON.stringify(value)); }); momsPromise.catch(function(reason) { console.log("Mom coudn't buy me the phone because ", reason); }); momsPromise.finally(function() { console.log( "Irrespecitve of whether my mom can buy me a phone or not, I still love her" ); });
Результат
- Как видите, поскольку «momsSavings» недостаточно для оплаты Iphone, обещание было отклонено и сработал метод catch.
- Он также активировал метод «наконец-то», который срабатывает независимо от результата.
Счастливая история
Чтобы у истории был счастливый конец, я сделал пожертвование семье, чтобы мать могла купить телефон своему сыну.
var momsPromise = new Promise(function(resolve, reject) { momsSavings = 200; priceOfPhone = 700; roriDonation = 600; if (momsSavings + roriDonation > priceOfPhone) { resolve({ brand: "iphone", model: "6s" }); } else { reject("We donot have enough savings. Let us save some more money."); } }); momsPromise.then(function(value) { console.log("Hurray I got this phone as a gift, thank you Rori"); }); momsPromise.catch(function(reason) { console.log("Mom coudn't buy me the phone because ", reason); }); momsPromise.finally(function() { console.log( "Irrespecitve of whether my mom can buy me a phone or not, I still love her" ); });
Результат
- И, как вы можете видеть, это вызвало метод «тогда», означающий, что сын может получить значение обещания.
- И снова снова сработал метод «наконец», потому что он срабатывал независимо от результата.