0:00
В этом видео мы поговорим о еще одном способе работы с асинхронным кодом,
который называется Promises.
Для того чтобы создать promise,
нам нужно вызвать конструктор promise и передать первым аргументом функцию.
Внутри этой функции будет содержаться работа с асинхронным кодом.
В нашем случае мы будем читать файл data.json.
Если чтение файла завершилось с ошибкой,
то мы вызываем функцию reject, куда передаем информацию об ошибке.
Если чтение файла завершилось удачно, то мы вызываем функцию resolve.
В качестве параметров в функцию resolve мы передаем содержимое файла.
Как только мы создали promise,
он находится в состоянии pending — неопределенное состояние.
Если асинхронная операция завершилась хорошо,
то есть позвали метод resolve, то promise переходит в состояние fulfilled.
Если во время выполнения асинхронной операции произошла ошибка
или позвали метод reject, то promise переходит в состояние rejected.
Оба эти состояния являются конечными, то есть как только promise в них перешел,
больше он не может поменять своего состояния.
Для того чтобы получить результат работы promise,
нам необходимо навесить обработчики.
Сделать мы это можем при помощи вызова метода then.
Первым аргументов then получает функцию,
которая будет вызвана в случае, если promise завершился успешно.
Если во время выполнения promise произошла ошибка, то позовется функция,
которая передается вторым аргументом.
В нашем случае мы можем записать обработчики более лаконично,
поскольку console.error и console.log уже являются функциями.
Следует отметить, что метод then мы можем вызывать,
даже если promise находится в одном из двух resolved state.
При работе с promise, нам приходится писать немного больше кода,
поскольку появляются функции-обработчики,
которые разделяют работу асинхронного кода и работу с результатом.
Кроме того, производительность promise немного ниже,
чем производительность callback.
Однако наряду с этими недостатками мы получаем целый ряд преимуществ.
Самое главное преимущество заключается в том,
что мы отловим неконтролируемые исключения.
Давайте рассмотрим вот такой пример.
Если во время чтения файла произошла неконтролируемая ошибка,
мы это можем проиллюстрировать, вызвав ее самостоятельно при помощи метода throw,
то эту ошибку мы поймаем в обработчике,
который передается вторым параметром в метод then.
И мы увидим на консоли сообщение об ошибке.
Еще одно преимущество заключается в том,
что мы можем навесить несколько обработчиков.
Это называется цепочка promise.
Подробнее о цепочке promise мы поговорим в следующем видео.