Давайте проясним некоторые заблуждения: обещания не касаются замены обратных вызовов. Обещания обеспечивают надежного посредника, то есть между вызывающим кодом и асинхронным кодом, который будет выполнять задачу, для управления обратными вызовами.
Что такое обещание?
Обещание - это будущее значение, независимый от времени контейнер, обернутый вокруг значения. Когда-нибудь в будущем он может дать одно значение: либо разрешенное значение, либо причина, по которой оно не решено (например, произошла сетевая ошибка). Считается, что это асинхронная версия возвращаемого значения функции синхронизации.
Promise - это прослушиватель событий, на котором вы можете зарегистрироваться, чтобы прослушивать событие, которое позволяет узнать, когда задача завершена. Это событие, которое срабатывает только один раз, но тем не менее может рассматриваться как событие.
Как работают обещания?
Обещание будет в одном из 4 возможных состояний:
- Выполнено: действие, связанное с обещанием, выполнено.
- Отклонено: действие, связанное с обещанием, не выполнено.
- На рассмотрении: еще не выполнено или отклонено
- Отклонено: выполнено или отклонено
После урегулирования обещание не может быть переселено. Повторный вызов resolve()
или reject()
не даст никакого эффекта. Неизменность установленного обещания - важная особенность.
Вот как вы обычно используете Promise для рефакторинга вызова функции, зависящей от обратного вызова.
Важные правила обещаний
Обещания, следующие спецификации, должны соответствовать определенному набору правил:
- Промис или «thenable» - это объект, который предоставляет совместимый со стандартом
.then()
метод. - Отложенное обещание может перейти в состояние "выполнено" или "отклонено".
- Выполненное или отклоненное обещание считается выполненным и не должно переходить ни в какое другое состояние.
- Как только обещание выполнено, оно должно иметь значение (которое может быть
undefined
). Это значение не должно изменяться.
Источники / Расширенное чтение
Документация по обещаниям Джейка Арчибальда
Надеюсь, вам понравился этот блог, комментируйте, если у вас есть какие-либо вопросы или предложения. Не стесняйтесь оставлять несколько аплодисментов ниже!