Изучите обещания JavaScript: их механизм и значение
Вы уже знакомы со словом Promise
. Мы все даем несколько обещаний и обещаний в жизни нашим близким, друзьям и семье, которые мы называем обещаниями в режиме реального времени.
Promises and pie-crust are made to be broken.
– Джонатан Свифт
Что такое обещание с технической точки зрения?
Обещание — это объект JavaScript, представляющий завершение асинхронной операции и результирующее значение. Промис позволяет выполнять трудоемкие задачи, такие как извлечение данных из API, чтение файлов или выполнение сложных вычислений.
У обещаний JavaScript есть три состояния: ожидание, разрешение и отклонение.
Когда вы выполняете обещание, оно сначала переходит в состояние ожидания, ожидая выполнения. После выполнения обещание может иметь два результата: resolved
, указывающий на успешное выполнение с данными, предоставленными функции .then()
, или rejected
, когда ошибка отправляется функции .catch()
. Если функция вызывается с обещанием, она будет продолжать работать до тех пор, пока обещание не будет выполнено и требуемые данные не будут возвращены вызывающей функции.
Например:
Разные подходы к обещаниям
- Обещание.все
- Обещание.любое
- Обещание.гонка
- Promise.allSettled
- Последовательности обещаний
Давайте углубимся в обещания.
1. Обещание.все
Promise.all
— это интегрированная функция, которая принимает массив обещаний и возвращает комбинированное обещание. При разрешении он предоставляет массив всех разрешенных значений, переданных в качестве аргументов. Если какое-либо обещание отклоняется, комбинированное обещание также отклоняется.
Синтаксис:
Promise.all(iterable)
Примечание. Здесь iterable — это массив промисов.
В этом примере у нас есть три промиса. Когда promise1 разрешается, возвращается "foo". Позже возвращается promise2 разрешается, предоставляя строку "bar", в то время как третье обещание отклоняется, что приводит к объекту ошибки со значением ". баз.”
Используя Promise.all(),
, мы запускаем оба промиса одновременно, ожидая их завершения, прежде чем продолжить. Результаты возвращаются в виде массива в исходном порядке.
При первом вызове Promise.all()
оба промиса успешно разрешаются, что приводит к выполнению блока .then()
и созданию значений [‘foo’, ‘bar’].
Однако во втором вызове Promise.all()
одно промис (promise3) отклоняется, что приводит к срабатыванию блока .catch()
и выводу ошибки 'baz'.
В общем, Promise.all()
— хороший вариант, когда мы хотим убедиться, что несколько промисов выполнены, прежде чем двигаться вперед.
2. Обещание.любое
Функция Promise.any()
в API обещаний JavaScript принимает на вход массив обещаний и возвращает новое обещание.
Он разрешается со значением первого разрешенного промиса или завершается ошибкой с экземпляром AggregateError
, если все промисы терпят неудачу.
Синтаксис:
Promise.any(iterable)
Примечание. Здесь iterable — это массив промисов.
В этом сценарии у нас есть четыре обещания: promise1 и promise2 разрешаются как выполненные после 1-секундной задержки, в то время как promise3 и promise4 отклоняются после 2-секундной задержки.
Случай 1. По истечении указанного времени Promise.any()
выполняет оба обещания с promise1. сначала разрешается и возвращается 'Promise 1 выполнено'.
Случай 2. Одно из обещаний успешно разрешается, что приводит к "Promise 2 решено", когда promise2 выполняется.
Случай 3: если ни одно из обещаний не выполнено и все они отклонены, Promise.any()
возвращает AggregateError
с массивом всех отклоненных причин. Система сообщает о проблеме с сообщениями "Обещание 3 отклонено" и "Обещание 4 отклонено".
В большинстве случаев Promise.any()
продолжается, не дожидаясь выполнения последующих обещаний, возвращаясь немедленно.
3. Promise.race
Promise.race()
получает массив обещаний и быстро разрешает или отклоняет на основе первого разрешенного или отклонено обещание.
Имя Promise.race()
предполагает соревнование между обещаниями для определения победителя, независимо от статуса решения. Он возвращает первое установленное обещание.
Синтаксис:
Promise.race(iterable)
Примечание. Здесь iterable — это массив промисов.
В этом сценарии мы дали четыре обещания: promise1 и promise2являются. >решено в течение указанного времени. Однако promise3 и promise4 одновременно отклоняются и отклоняются.
Случай 1. promise1 разрешается за 1 секунду, быстрее, чем promise2 (2 секунды). ). Promise.race()
заканчивается 'Обещание 1 выполнено'.
Случай 2. promise2 устанавливается за 2 секунды, а promise3 — через 3 секунды. Таким образом, сначала обрабатывается promise2, выполняется .then()
и возвращается 'Promise 2 выполнено'.
Случай 3. promise3 устанавливается через 4 секунды, promise4 – через 3 секунды. Promise.race()
отклоняет promise4, так как он рассчитывается первым, вызывая .catch()
и возвращая 'Promise 4 отклонено'.
В целом, Promise.race()
одновременно обрабатывает несколько промисов и возвращает результат первого выполненного промиса. Это полезно для получения первого результата асинхронных действий.
4. Обещание.все выполнено
Функция Promise.allsettled()
в API обещаний JavaScript принимает в качестве входных данных массив обещаний и возвращает новое обещание. Это новое обещание устанавливается, когда все обещания в итерируемом объекте выполнены, т. е. независимо от того, выполнено или отклонено. .
После разрешения каждого входного промиса он возвращает новый промис с массивом объектов. Эти объекты имеют два атрибута: status and either value or reason
. Выполненные обещания имеют ценность, а отклоненные обещания имеют причину.
Синтаксис:
Promise.allsettled(iterable)
Примечание. Здесь iterable — это массив промисов.
Случай 1:два обещания, promise1 и promise2, успокоиться через 2 секунды. Они возвращают "Обещание 1 выполнено" и "Обещание 2 выполнено" соответственно, оба выполнены.
Случай 2. Два обещания, promise2 и promise3, выполняются через 3 секунды. Они возвращают "Обещание 2 выполнено" (выполнено) и "Обещание 3 отклонено" (отклонено).
Случай 3. Два обещания, promise3 и promise4, выполняются через 4 секунды. Они возвращают "Обещание 3 отклонено" и "Обещание 4 отклонено" с отклонено статус.
В общем, функция Promise.allSettled()
эффективно обрабатывает несколько обещаний одновременно, управляя всеми результатами (выполненными или отклоненными).
5. Последовательность обещаний
В Sequence of Promises,
одно обещание выполняется после разрешения предыдущего, известного как Nested Promises
или Promise Pyramids
. Эта иерархическая структура позволяет каждому промису зависеть от разрешения его родительского промиса, обеспечивая гибкость с переменными внешней области.
Случай 1: у нас есть цепочка из трех промисов, которые выполняются последовательно, что приводит к успешному выполнению и созданию журналов успеха. Блок catch в этом сценарии вызываться не будет.
Случай 2. В этой цепочке из трех обещаний одно обещание может быть отклонено. Несмотря на это, промисы по-прежнему выполняются последовательно, создавая журналы успеха до тех пор, пока не произойдет отклонение. В этом случае блок catch будет выполнен.
Примечание. Sequence of Promises
решает проблемуАд обратных вызовов.
Иногда это может вызвать проблемы с читаемостью кода и простой обработкой ошибок. Чтобы избежать этого, мы можем использовать современную технику асинхронного JavaScript async/await.
Давайте разберемся с async/await на примере:
Пример в Случае 1 был обновлен с использованием синтаксиса async/await, что улучшает читабельность и структуру кода.
Напутствие
Промисы предлагают цепочку, обработку ошибок, параллельную обработку и краткий синтаксис, упрощая асинхронные задачи, такие как заказ и отслеживание доставки еды в Интернете. Он информирует вас о готовности еды и любых проблемах.
Обещания асинхронного JavaScript остаются жизненно важными при разработке программного обеспечения, позволяя создавать высокоэффективные и удобные приложения.
Подпишитесь на блог Simform Engineering, чтобы узнать больше о новейших инструментах и технологиях.