В JavaScript обещания — это специальные объекты, помогающие выполнять асинхронные операции.

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

Обещание — это специальный объект JavaScript. Он выдает значение после успешного завершения асинхронной (также известной как асинхронная) операции или ошибку, если она не завершается успешно из-за тайм-аута, сетевой ошибки и т. д.

Вот пример обещания в JavaScript:

В большинстве случаев обещание может использоваться для асинхронной операции. Однако технически вы можете разрешать/отклонять как синхронные, так и асинхронные операции.

У нас есть функции обратного вызова в JavaScript. Но обратный вызов не является чем-то особенным в JavaScript. Это обычная функция, которая выдает результаты после завершения асинхронного вызова (с успехом/ошибкой).

Слово «асинхронный» означает, что что-то произойдет в будущем, а не прямо сейчас. Обычно обратные вызовы используются только при таких вещах, как сетевые вызовы, загрузка/выгрузка чего-либо, общение с базами данных и т. д.

Хотя обратные вызовы полезны, у них есть и огромный недостаток. Иногда у нас может быть один обратный вызов внутри другого обратного вызова, который находится в еще одном обратном вызове и так далее.

ОБЕЩАНИЯ В ЯВАСКРИПТЕ:

Обещание в JavaScript похоже на обещание в реальной жизни. Когда мы даем обещание в реальной жизни, это гарантия того, что мы собираемся что-то сделать в будущем. Потому что обещания можно давать только на будущее.

Обещание имеет 2 возможных исхода: либо оно будет выполнено, когда придет время, либо нет. То же самое относится и к обещаниям в JavaScript. Когда мы определяем обещание в JavaScript, оно будет разрешено, когда придет время, или будет отклонено.

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

Функция-исполнитель принимает два аргумента: разрешение и отклонение. Это обратные вызовы, предоставляемые языком JavaScript. Ваша логика находится внутри функции-исполнителя, которая запускается автоматически при создании нового промиса.

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

Объект обещания имеет следующие внутренние свойства:

1. состояние — это свойство может иметь следующие значения:

  • pending: Первоначально, когда функция-исполнитель начинает выполнение.
  • выполнено: когда обещание выполнено.
  • отклонено: когда обещание отклонено.

2. результат — это свойство может иметь следующие значения:

  • undefined: изначально, когда значение состояния находится на рассмотрении.
  • значение: когда вызывается разрешение (значение).
  • error: Когда вызывается reject(error).

Эти внутренние свойства недоступны для кода, но их можно проверить. Это означает, что мы сможем проверить состояние и получить значения свойств с помощью инструмента отладчика, но мы не сможем получить к ним доступ напрямую с помощью программы.

Состояние обещания может быть ожидающим, выполненным или отклоненным. Обещание, которое либо разрешено, либо отклонено, называется выполненным.

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

Если нам удастся получить информацию с сервера, обещание будет успешно разрешено. Но если мы не получим информацию, то Promise будет в состоянии reject.

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

Обработка обещаний:

Обещание использует функцию-исполнитель для выполнения задачи (в основном асинхронно). Функция-потребитель (которая использует результат обещания) должна получать уведомление, когда функция-исполнитель завершает работу либо с разрешением (успех), либо с отклонением (ошибка).

Методы обработчика, .then(), .catch() и .finally(), помогают создать связь между исполняющей и потребительской функциями, чтобы они могли быть синхронизированы, когда обещание разрешается или отклоняется.

Использование .then() в промисах:

Метод .then() должен вызываться для объекта обещания для обработки результата (разрешение) или ошибки (отклонение).

Он принимает две функции в качестве параметров. Обычно метод .then() следует вызывать из потребительской функции, в которой вы хотите узнать результат выполнения промиса.

Использование .catch() в промисах:

Вы можете использовать этот метод обработчика для обработки ошибок (отказов) от промисов. Синтаксис передачи null в качестве первого аргумента для .then() не лучший способ обработки ошибок. Итак, у нас есть функция .catch(), выполняющая ту же работу с некоторым изящным синтаксисом:

Если мы сгенерируем ошибку вроде новой ошибки («Что-то не так!») вместо вызова отказа от исполнителя обещаний и обработчиков, это все равно будет рассматриваться как отклонение. Это означает, что это будет перехвачено методом обработчика .catch.

Это то же самое для любых синхронных исключений, которые происходят в функциях исполнителя и обработчика обещаний.

Вот пример, где это будет обработано как отклонение, и будет вызван метод обработчика .catch:

Использование .finally() в обещаниях:

Обработчик .finally() выполняет такие очистки, как остановка загрузчика, закрытие активного соединения и т.д. Метод finally() будет вызываться независимо от того, разрешается или отклоняется промис. Он передает результат или ошибку следующему обработчику, который может снова вызвать .then() или .catch().

Первоначально опубликовано на https://www.codeaxess.com 16 января 2022 г.