Все мы знаем, что JavaScript — это синхронный язык программирования. Но функции обратного вызова помогают сделать его асинхронным языком программирования.
Какими бы полезными ни были функции обратного вызова в JS, у них были свои проблемы и болевые точки. И поверьте мне, «ад обратных вызовов» — не самая большая проблема. Итак, вам интересно, что это такое… это не что иное, как «инверсия управления». Давайте не будем тратить время на понимание всех их недостатков, вы, ребята, достаточно умны, чтобы погуглить (ChatGPT/Bard) термины и понять.
Но поскольку функции обратного вызова доставляют столько хлопот, мы придумали Promises в JS. Давайте очень просто поймем обещания из приведенного ниже примера!
- Обещания как официант.
- Обещают принести еды, но на это нужно время.
- Пока вы ждете, вы можете заняться другими делами.
- Если еда готова, официант приносит ее вам.
- Если еда не готова, официант сообщает вам.
Другими словами, промисы — это способ обработки асинхронных операций в JavaScript. Асинхронные операции — это операции, которые не блокируют основной поток выполнения. Это означает, что вы можете выполнять несколько асинхронных операций одновременно, и ваша страница не перестанет отвечать на запросы.
Обещания — это просто более простой способ управления асинхронными операциями в JS.
Объект
Promise
the представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.
Из приведенного выше примера видно, что обещания в JS аналогичны обязательствам, которые мы берем на себя в повседневной жизни.
Промисы в основном используются для повышения читабельности кода. Обещания делают код более чистым и управляемым. Использование промисов считается хорошей практикой.
Обещание имеет три состояния:
- В ожидании: обещание еще не выполнено.
- Выполнено: обещание успешно выполнено.
- Отклонено: обещание выполнено с ошибкой.
Теперь давайте посмотрим, как создавать промисы:
Мы можем создать обещание с помощью конструктора new Promise()
. Конструктор принимает два аргумента: функцию разрешения и функцию отклонения. Функция разрешения вызывается, когда обещание выполняется, а функция отклонения вызывается, когда обещание отклоняется.
Вот пример того, как создать обещание, которое разрешается числом 10:
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve(10); }, 1000); });
Как использовать промисы
Мы можем использовать метод then()
для обработки выполнения или отклонения обещания. Метод then()
принимает два аргумента: функцию обратного вызова, которая вызывается, когда обещание выполнено, и функцию обратного вызова, которая вызывается, когда обещание отклонено.
Вот пример того, как использовать метод then()
для выполнения обещания, которое мы создали выше:
promise .then((value) => { console.log(value); // 10 }) .catch((error) => { console.log(error); // Error: The request timed out });
В этом примере метод then()
вызовет первую функцию обратного вызова, когда обещание будет выполнено. Первая функция обратного вызова будет регистрировать значение обещания, равное 10. Если обещание отклонено, метод then()
вызовет вторую функцию обратного вызова. Вторая функция обратного вызова зарегистрирует сообщение об ошибке.
Объект Promise
the представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.
Вспомогательные функции, связанные с обещаниями:
- Обещание.Все
Метод Promise.all(iterable)
the возвращает один Promise
, который разрешается, когда все промисы в аргументе iterable
разрешены или когда итерируемый аргумент не содержит промисов. Отклоняется по причине первого отклоняемого обещания.
2. Promise.race
Метод Promise.race(iterable)
the возвращает обещание, которое разрешается или отклоняется, как только одно из обещаний в итерируемом объекте разрешается или отклоняется, со значением или причиной из этого обещания.
Ключевые моменты, которые следует помнить
- Используйте обещания всякий раз, когда вы используете асинхронный или блокирующий код.
- Обещание — это объект, который возвращает значение в будущем.
- Обещание начинается в состоянии ожидания и заканчивается либо в состоянии выполнено, либо в состоянии отклонения.
resolve
сопоставляется сthen
&reject
сопоставляется сcatch
- Если что-то нужно сделать в обоих случаях, используйте
.finally
Заключение
Промисы — это способ аккуратно связать асинхронные операции без глубоко вложенных обратных вызовов.
Promise.All — ожидает разрешения всех промисов и возвращает массив их результатов. Если какое-либо из данных обещаний отклоняется, это становится ошибкой Promise.All, а все остальные результаты игнорируются.
Promise.AllSettled — ожидает выполнения всех обещаний и возвращает их результаты в виде массива объектов, которые могут быть разрешены или отклонены по отдельности.
Promise.Race — вернет экземпляр обещания, которое сначала разрешено или отклонено.
Это обертка для этого. Следите за дальнейшими блогами о более продвинутых концепциях JavaScript!