Обзор:
В этой статье будет рассмотрена концепция промисов, но предполагается, что читатель понимает некоторые фундаментальные концепции JavaScript. Наслаждаться!
Что такое обещание:
Обещание помогает разработчикам определить, была ли функция выполнена или отклонена. Обещание может помочь разработчикам управлять состоянием приложения, которое зависит от запроса API, а также настраивать ответ на выполненный или неудачный запрос.
Есть три состояния, которые нарушают обещание:
- Ожидание: инициализированное состояние, ожидающее разрешения или отклонения.
- Решено: означает, что операция завершилась успешно.
- Отклонено: означает, что операция не удалась.
Ожидаемое обещание
Давайте создадим наш первый Promise с состоянием Pending.
// Creating an initial Promise. const promise = new Promise((resolve, reject) => {})
Инициализированное обещание будет поддерживать состояние Ожидание до тех пор, пока мы не выполним функцию разрешения или отклонения.
Выполненное обещание
Обещание с состоянием Решено. Обещание по-прежнему будет инициализироваться в состоянии Ожидание, но немедленно разрешится и перейдет в состояние Разрешено. Resolved используются для обозначения успешного выполнения с возвращенным сообщением или некоторыми данными.
const promiseMessage = new Promise((resolve, _) => { resolve("Promise has been resolved"); }) const promiseData = new Promise(resolve, _) => { const data = { username: "I am a user" } resolve(data); })
(Скоро мы расскажем, как получить доступ к разрешенным данным.)
Отклоненное обещание
Концепция вызова состояния Отклонено аналогична состоянию Разрешено, но мы указываем, что обещание не удалось успешно выполнить и будет возвращать ошибку.
const promiseMessage = new Promise((_, reject) => { reject("Promise has been resolved"); }) const promiseData = new Promise(resolve, _) => { const data = { status: 401, errorMessage: "User not found." } reject(data); })
Как использовать обещания
Промисы хороши для создания асинхронных функций, выполняющих запросы к API. JavaScript по умолчанию является синхронным языком, и если нам нужно сохранить наш код до завершения операции, то промисы пригодятся.
Давайте посмоделируем запрос API.
const promise = new Promise((resolve, reject) => { const data = ['a', 'b'] setTimeout(() => { resolve(data) }, 2000) }) // Will display ['a', 'b'] promise.then(snapshot => console.log(snapshot));
Мы создали Promise, который имитирует запрос API, который занимает 2000 мс и 2 секунды. Затем мы можем использовать метод .then для связывания логики с промисами после их успешного завершения. Чтобы фиксировать состояния Отклонено, мы добавим в цепочку метод .catch.
Чтобы проверить это, мы могли бы изменить состояние Promise с гарантированного состояния Resolved на гарантированное состояние Rejected.
const promise = new Promise((resolve, reject) => { const data = ['a', 'b'] setTimeout(() => { // resolve(data) reject("Failed to execute.") }, 2000) }) // Will display "Failed to execute." promise .then(snapshot => console.log(snapshot)) .catch(error => console.error(error))
Обещания могут быть очень полезными при разработке приложения, которое зависит от ответа на запрос API.
Вот несколько практических задач, которые вы можете использовать, чтобы лучше понять, как работают промисы.
- Что произойдет, если мы создадим промис и не будем вызывать методы разрешения или отклонения?
- Если мы разрешим/отклоним обещание, будут ли выполнены какие-либо строки кода после слов?
- Можете ли вы создать обещание внутри обещания?
Откройте файл JavaScript и запустите nodemon, чтобы проверить его!