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

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

Вот простой пример обещания:

Итак, начиная с довольно нереалистичного варианта использования для объяснения, здесь мы видим, что myPromise создается как объект Promise, который находится в ожидании. Но как только setTimeout активирует метод разрешения, myPromise становится «разрешенным» промисом (иначе известным как «выполненным»). Чтобы получить доступ к значению, которое теперь содержит промис, нам нужно вызвать метод .then().

Например:

Вызов .then() происходит, когда промис успешно разрешен и значение существует для дальнейших операций. Если вы запустите приведенный выше пример в консоли JS, вы увидите, что проходит секунда, а затем сообщение регистрируется, поскольку промис теперь разрешен с этим значением.

Цепочка .then()

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

Как только это обещание разрешится, мы увидим следующие сообщения, зарегистрированные в консоли:

Promise resolved message
Promise resolved message 1
Promise resolved message 1 2
Promise resolved message 1 2 3

И разрешенное значение в промисе будет окончательным возвращаемым значением в цепочке функций .then():

Promise {<resolved>: "Promise resolved message 1 2 3"}

Обработка ошибок

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

Например:

Поскольку указанное выше обещание будет отклонено по прошествии 900 мс, оно не будет разрешено, и метод .then() никогда не будет вызываться, вместо этого отклонение обещания вызовет метод .catch(), в котором мы регистрируем содержимое Ошибка. В более реальном сценарии это было бы местом, где мы получаем доступ к результатам выброшенных ошибок, возможно, в результате неправильно сформированного вызова API или сбоя базы данных.

Дополнительные ресурсы