Изучите обещания JavaScript: их механизм и значение

Вы уже знакомы со словом Promise. Мы все даем несколько обещаний и обещаний в жизни нашим близким, друзьям и семье, которые мы называем обещаниями в режиме реального времени.

Promises and pie-crust are made to be broken. – Джонатан Свифт

Что такое обещание с технической точки зрения?

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

У обещаний JavaScript есть три состояния: ожидание, разрешение и отклонение.

Когда вы выполняете обещание, оно сначала переходит в состояние ожидания, ожидая выполнения. После выполнения обещание может иметь два результата: resolved, указывающий на успешное выполнение с данными, предоставленными функции .then(), или rejected, когда ошибка отправляется функции .catch(). Если функция вызывается с обещанием, она будет продолжать работать до тех пор, пока обещание не будет выполнено и требуемые данные не будут возвращены вызывающей функции.

Например:

Разные подходы к обещаниям

  1. Обещание.все
  2. Обещание.любое
  3. Обещание.гонка
  4. Promise.allSettled
  5. Последовательности обещаний

Давайте углубимся в обещания.

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, чтобы узнать больше о новейших инструментах и ​​технологиях.

Подпишитесь на нас: Twitter | ЛинкедИн