Понимание промисов в JavaScript
7 марта 2023 г.Всем привет!
На написание этой статьи меня вдохновили мои ученики и подопечные. Подобных статей много в интернете, но эту я посвящаю новичкам (конкретно тем, кому нужно знать только основы).
Эта статья будет полезна, если вы только начинаете свой путь в качестве инженера по автоматизации контроля качества.
ВАЖНО. Это неполное руководство по асинхронным функциям и обещаниям. Если вы хотите узнать больше, лучше ознакомьтесь с веб-документами mdn а>.
Что обещают?
Говоря технически, Promise — это объект. Он представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.
Лучшим примером объекта Promise является запрос HTTP:

Когда вы отправляете запрос - серверу требуется некоторое время для его обработки (это означает, что мы не получаем ответ от сервера сразу).

Как только сервер обработал запрос — мы получаем от него ответ. Как видно на снимке экрана, ответ сервера занял ~3 секунды.
КАК это работает в Javascript?
Итак, если бы мы выполнили функцию JavaScript fetch, чтобы получить ответ — мы также не получим его сразу.
То есть функция fetch вернет Promise вместо ответа:

С точки зрения JavaScript — он выполнил свою работу (запрос отправлен, не так ли?).
Если мы посмотрим на функцию fetch, мы увидим, что это функция, которая возвращает Promise<Response>:

Это означает, что эта функция возвращает Promise (конечно же). Но если мы подождем разрешения Promise, он вернет объект Response!
Как мы ждем? Ну, есть 2 способа сделать это…
Синхронный код
Используйте функцию затем:

Функция затем получает разрешенный объект (Response в текущем примере) — то есть все, что Promise<something> попало внутрь <> ;код>.
Асинхронный код
Использовать async / await:

Чем это отличается от того, что мы сделали в примере с синхронным (синхронным)?
- Вам не нужна функция
.then()для извлечения значения из функции async (fetch).
2. Ключевое слово await доступно в функциях async только.
3. Если вы не будете использовать слово await в асинхронных функциях (тех, которые возвращают объекты Promise) - они будут выполняться одновременно. р>
Асинхронный запуск кода
Синтаксисasync / await и then() кажется излишним в большинстве случаев использования, если вы тот, кто разрабатывает автоматизированные тесты. . Почему этот синтаксис вообще существует? Какой в этом смысл? Почему мы не можем просто получить нужное нам значение из функции?
Ответ прост — это позволяет нам определять функции без строгой последовательности команд.
То есть, что если нам нужно выполнить 10 запросов, но не обязательно выполнять их синхронно (один за другим)?
Promise.all([
fetch(...),
fetch(...),
...
]).then((responses) => {
responses.forEach(value => console.log(value))
})
Приведенный выше код будет запускать все команды fetch внутри Promise.all([]), а затем ждать их разрешения (завершения) и регистрировать в консоли каждый ответ.
ИЛИ вы можете сделать то же самое с конструкцией async/await:
const [responses] = await Promise.all([
fetch(...),
fetch(...),
...
])
responses.forEach(value => console.log(value))
Заключение
Теперь вы знаете основы использования объекта Promise, и этого будет достаточно для большинства случаев использования, особенно если вы работаете с автоматическими тестами.
Кроме того, имейте в виду, что большинство разработчиков используют конструкцию async / await вместо sync (т. е. .then()), поскольку он должен быть «синтаксическим сахаром».
Спасибо за прочтение! Надеюсь, вы сегодня узнали что-то новое :nerd_face:
Оригинал