что такое promise зачем нужен async await

Async/await

Существует специальный синтаксис для работы с промисами, который называется «async/await». Он удивительно прост для понимания и использования.

Асинхронные функции

У слова async один простой смысл: эта функция всегда возвращает промис. Значения других типов оборачиваются в завершившийся успешно промис автоматически.

Например, эта функция возвратит выполненный промис с результатом 1 :

Можно и явно вернуть промис, результат будет одинаковым:

Await

Ключевое слово await заставит интерпретатор JavaScript ждать до тех пор, пока промис справа от await не выполнится. После чего оно вернёт его результат, и выполнение кода продолжится.

В этом примере промис успешно выполнится через 1 секунду:

В данном примере выполнение функции остановится на строке (*) до тех пор, пока промис не выполнится. Это произойдёт через секунду после запуска функции. После чего в переменную result будет записан результат выполнения промиса, и браузер отобразит alert-окно «готово!».

Обратите внимание, хотя await и заставляет JavaScript дожидаться выполнения промиса, это не отнимает ресурсов процессора. Пока промис не выполнится, JS-движок может заниматься другими задачами: выполнять прочие скрипты, обрабатывать события и т.п.

Ошибки не будет, если мы укажем ключевое слово async перед объявлением функции. Как было сказано раньше, await можно использовать только внутри async –функций.

Давайте перепишем пример showAvatar() из раздела Цепочка промисов с помощью async/await :

Получилось очень просто и читаемо, правда? Гораздо лучше, чем раньше.

Можно обернуть этот код в анонимную async –функцию, тогда всё заработает:

В примере ниже, экземпляры класса Thenable будут работать вместе с await :

Для объявления асинхронного метода достаточно написать async перед именем:

Обработка ошибок

Делает то же самое, что и такой:

Но есть отличие: на практике промис может завершиться с ошибкой не сразу, а через некоторое время. В этом случае будет задержка, а затем await выбросит исключение.

Так сделано в строке (*) в примере выше.

Итого

Ключевое слово async перед объявлением функции:

Ключевое слово await перед промисом заставит JavaScript дождаться его выполнения, после чего:

Вместе они предоставляют отличный каркас для написания асинхронного кода. Такой код легко и писать, и читать.

Источник

Async/await: 6 причин забыть о промисах

Если вы не в курсе, в Node.js, начиная с версии 7.6, встроена поддержка механизма async/await. Говорят о нём, конечно, уже давно, но одно дело, когда для использования некоей функциональности нужны «костыли», и совсем другое, когда всё это идёт, что называется, «из коробки». Если вы ещё не пробовали async/await — обязательно попробуйте.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Основы async/await

Для тех, кто не знаком с async/await, вот основные вещи, которые полезно будет знать прежде чем двигаться дальше.

Синтаксис

С использованием промисов подобное можно реализовать так:

Вот как то же самое делается с использованием async/await:

Если сопоставить два вышеприведённых фрагмента кода, можно обнаружить следующее:

Почему async/await лучше промисов?

Рассмотрим обещанные шесть преимуществ async/await перед традиционными промисами.

▍1. Лаконичный и чистый код

▍2. Обработка ошибок

Вот то же самое, переписанное с использованием async/await. Блок catch теперь будет обрабатывать и ошибки, возникшие при парсинге JSON.

▍3. Проверка условий и выполнение асинхронных действий

Представьте, что надо написать кусок кода, который, загрузив некие данные, принимает решение о том, вернуть ли их в точку вызова, или, основываясь на том, что уже получено, запросить ещё что-нибудь. Решить подобную задачу можно так:

Только от взгляда на эту конструкцию может разболеться голова. Очень легко потеряться во вложенных конструкциях (тут их 6 уровней), скобках, командах возврата, которые нужны лишь для того, чтобы доставить итоговый результат главному промису.

Код будет гораздо легче читать, если решить задачу с использованием async/await.

▍4. Промежуточные значения

При таком подходе семантика приносится в жертву читабельности кода. Нет причин для того, чтобы помещать value1 и value2 в один и тот же массив за исключением того, чтобы избежать вложенности промисов.

То же самое можно написать с применением async/await, причём делается это удивительно просто, а то, что получается, оказывается интуитивно понятным. Тут поневоле задумаешься о том, сколько полезного можно сделать за то время, которое тратится на написание хоть сколько-нибудь приличного кода с использованием промисов.

▍5. Стеки ошибок

Представьте себе фрагмент кода, в котором имеется цепочка вызовов промисов, а где-то в этой цепочке выбрасывается ошибка.

Если же взглянуть на подобную ситуацию при использовании async/await, стек ошибки укажет на ту функцию, в которой возникла проблема.

▍6. Отладка

Этот пункт последний, но это не значит, что он не особо важен. Ценнейшая особенность использования async/await заключается в том, что код, в котором задействована эта конструкция, гораздо легче отлаживать. Отладка промисов всегда была кошмаром по двум причинам.

1. Нельзя установить точку останова в стрелочных функциях, которые возвращают результаты выполнения выражений (нет тела функции).

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Попробуйте поставить где-нибудь в этом коде точку останова

При использовании async/await особой нужды в стрелочных функциях нет, и можно «шагать» по вызовам, выполненным с ключевым словом await так же, как это делается при обычных синхронных вызовах.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Отладка при использовании async/await

Замечания

Вполне возможно, у вас возникнут некоторые соображения не в пользу применения async/await, продиктованные здоровым скептицизмом. Прокомментируем пару наиболее вероятных.

Выводы

Пожалуй, async/await — это одна из самых полезных революционных возможностей, добавленных в JavaScript в последние несколько лет. Она даёт простые и удобные способы написания и отладки асинхронного кода. Полагаем, async/await пригодится всем, кому приходится писать такой код.

Уважаемые читатели! Как вы относитесь к async/await? Пользуетесь ли вы этой возможностью в своих проектах?

Источник

Разбираем Async/Await в JavaScript на примерах

что такое promise зачем нужен async await. 2c8f4a252d33ee663665fd7df02b45ed. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-2c8f4a252d33ee663665fd7df02b45ed. картинка что такое promise зачем нужен async await. картинка 2c8f4a252d33ee663665fd7df02b45ed.

Автор статьи разбирает на примерах Async/Await в JavaScript. В целом, Async/Await — удобный способ написания асинхронного кода. До появления этой возможности подобный код писали с использованием коллбэков и промисов. Автор оригинальной статьи раскрывает преимущества Async/Await, разбирая различные примеры.

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Skillbox рекомендует: Образовательный онлайн-курс «Java-разработчик».

Callback

Callback представляет собой функцию, вызов которой отложен на неопределенное время. Раньше обратные вызовы использовались в тех участках кода, где результат не мог быть получен сразу.

Вот пример асинхронного чтения файла на Node.js:

Проблемы возникают в тот момент, когда требуется выполнить сразу несколько асинхронных операций. Давайте представим себе вот такой сценарий: выполняется запрос в БД пользователя Arfat, нужно считать его поле profile_img_url и загрузить картинку с сервера someserver.com.
После загрузки конвертируем изображение в иной формат, например из PNG в JPEG. Если конвертация прошла успешно, на почту пользователя отправляется письмо. Далее информация о событии заносится в файл transformations.log с указанием даты.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Стоит обратить внимание на наложенность обратных вызовов и большое количество >) в финальной части кода. Это называется Callback Hell или Pyramid of Doom.

Недостатки такого способа очевидны:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Положительным моментом промисов стало то, что с ними код читается гораздо лучше, причем сверху вниз, а не слева направо. Тем не менее у промисов тоже есть свои проблемы:

Предположим, что есть цикл for, выводящий последовательность чисел от 0 до 10 со случайным интервалом (0–n секунд). Используя промисы, нужно изменить этот цикл таким образом, чтобы числа выводились в последовательности от 0 до 10. Так, если вывод нуля занимает 6 секунд, а единицы — 2 секунды, сначала должен быть выведен ноль, а потом уже начнется отсчет вывода единицы.

Async-функции

Добавление async-функций в ES2017 (ES8) упростило задачу работы с промисами. Отмечу, что async-функции работают «поверх» промисов. Эти функции не представляют собой качественно другие концепции. Async-функции задумывались как альтернатива коду, который использует промисы.

Async/Await дает возможность организовать работу с асинхронным кодом в синхронном стиле.

Таким образом, знание промисов облегчает понимание принципов Async/Await.

В обычной ситуации он состоит из двух ключевых слов: async и await. Первое слово и превращает функцию в асинхронную. В таких функциях разрешается использование await. В любом другом случае использование этой функции вызовет ошибку.

Async вставляется в самом начале объявления функции, а в случае использования стрелочной функции — между знаком «=» и скобками.

Эти функции можно поместить в объект в качестве методов либо же использовать в объявлении класса.

NB! Стоит помнить, что конструкторы класса и геттеры/сеттеры не могут быть асинхронными.

Семантика и правила выполнения

Async-функции, в принципе, похожи на стандартные JS-функции, но есть и исключения.

Так, async-функции всегда возвращают промисы:

В частности, fn возвращает строку hello. Ну а поскольку это асинхронная функция, то значение строки обертывается в промис при помощи конструктора.

Вот альтернативная конструкция без Async:

В этом случае возвращение промиса производится «вручную». Асинхронная функция всегда обертывается в новый промис.

В том случае, если возвращаемое значение — примитив, async-функция выполняет возврат значения, обертывая его в промис. В том случае, если возвращаемое значение и есть объект промиса, его решение возвращается в новом промисе.

Но что произойдет в том случае, если внутри асинхронной функции окажется ошибка?

Если она не будет обработана, foo() вернет промис с реджектом. В этой ситуации вместо Promise.resolve вернется Promise.reject, содержащий ошибку.

Async-функции на выходе всегда дают промис, вне зависимости от того, что возвращается.

Await влияет на выражения. Так, если выражение является промисом, async-функция приостанавливается до момента выполнения промиса. В том случае, если выражение не является промисом, оно конвертируется в промис через Promise.resolve и потом завершается.

А вот описание того, как работает fn-функция.

Решаем задачу

Ну а теперь давайте рассмотрим решение задачи, которая была указана выше.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Вот решение с выводом чисел, здесь есть два варианта.

А вот решение с использованием async-функций.

Необработанные ошибки обертываются в rejected промис. Тем не менее в async-функциях можно использовать конструкцию try/catch для того, чтобы выполнить синхронную обработку ошибок.

canRejectOrReturn() — это асинхронная функция, которая либо удачно выполняется (“perfect number”), либо неудачно завершается с ошибкой (“Sorry, number too big”).

Поскольку в примере выше ожидается выполнение canRejectOrReturn, то собственное неудачное завершение повлечет за собой исполнение блока catch. В результате функция foo завершится либо с undefined (когда в блоке try ничего не возвращается), либо с error caught. В итоге у этой функции не будет неудачного завершения, поскольку try/catch займется обработкой самой функции foo.

Стоит уделить внимание тому, что в примере из foo возвращается canRejectOrReturn. Foo в этом случае завершается либо perfect number, либо возвращается ошибка Error (“Sorry, number too big”). Блок catch никогда не будет исполняться.

Проблема в том, что foo возвращает промис, переданный от canRejectOrReturn. Поэтому решение функции foo становится решением для canRejectOrReturn. В этом случае код будет состоять всего из двух строк:

А вот что будет, если использовать вместе await и return:

В коде выше foo удачно завершится как с perfect number, так и с error caught. Здесь отказов не будет. Но foo завершится с canRejectOrReturn, а не с undefined. Давайте убедимся в этом, убрав строку return await canRejectOrReturn():

Распространенные ошибки и подводные камни

В некоторых случаях использование Async/Await может приводить к ошибкам.

Такое случается достаточно часто — перед промисом забывается ключевое слово await:

В коде, как видно, нет ни await, ни return. Поэтому foo всегда завершается с undefined без задержки в 1 секунду. Но промис будет выполняться. Если же он выдает ошибку или реджект, то в этом случае будет вызываться UnhandledPromiseRejectionWarning.

Async-функции в обратных вызовах

Нам нужны аккаунты ArfatSalman, octocat, norvig. В этом случае выполняем:

Чрезмерно последовательное использование await

В качестве примера возьмем такой код:

Здесь в переменную count помещается число репо, затем это число добавляется в массив counts. Проблема кода в том, что пока с сервера не придут данные первого пользователя, все последующие пользователи будут находиться в режиме ожидания. Таким образом, в единый момент обрабатывается лишь один пользователь.

Promise.all на входе получает массив промисов с возвращением промиса. Последний после завершения всех промисов в массиве или при первом реджекте завершается. Может случиться так, что все они не запустятся одновременно, — для того чтобы обеспечить одновременный запуск, можно использовать p-map.

Заключение

Async-функции становятся все более важными для разработки. Ну а для адаптивного использования async-функций стоит воспользоваться Async Iterators. JavaScript-разработчик должен хорошо разбираться в этом.

Источник

Углубляемся в JavaScript: всё ли может async/await, или когда использовать Promise

Авторизуйтесь

Углубляемся в JavaScript: всё ли может async/await, или когда использовать Promise

что такое promise зачем нужен async await. DSC 0835 scaled e1612102615508. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-DSC 0835 scaled e1612102615508. картинка что такое promise зачем нужен async await. картинка DSC 0835 scaled e1612102615508.

руководитель AFFINAGE

Что такое async/await и promise?

Прежде чем ответить на поставленный вопрос, нам необходимо узнать немного теории.

Асинхронность меняет сложившуюся парадигму последовательного кода. Последовательность — когда только одна конкретная операция происходит в данный момент времени. Если функция зависит от результата выполнения другой функции, то она должна дождаться пока прошлая функция не завершит свою работу. Для пользователя это значит состояние вечного «ждуна».

Асинхронность нужна нам, чтобы делать несколько операций и функций параллельно. Асинхронное программирование — это инструмент для оптимизации высоконагруженных сайтов с долгими и частыми ожиданиями обратной связи. Например, когда одна функция создаёт canvas на странице, другая функция может подготовить данные необходимые для отрисовки внутри canvas. Ещё пример, когда пользователь кладет товар в корзину ему не обязательно ждать ответа сервера, мы заранее можем показать анимацию добавления товара в корзину, а всю остальную логику проверок сделать после ответа сервера, не блокируя интерфейс пользователю.

8 декабря в 18:00, Онлайн, Беcплатно

На самом деле с точки зрения машинного кода, async/await и промисы это абсолютно то же самое. Но мы то с вами люди, и нам важен синтаксис. И разница в синтаксисе настолько существенна, что разделила разработчиков на два лагеря. Любители колбэков выбрали Promise, а не любители цепочек выбрали async/await.

Async/await — синтаксис работающий с промисами, придуман как альтернатива синтаксису промисов. Используя async, можно полностью избежать использования цепочек промисов с помощью await. Async создает Promise. А await ждет выполнения промиса.

Давайте посмотрим практические маленькие примеры синтаксиса.

Так как async является надстройкой над промисами, то мы можем смешивать код, например так:

Плюсы и минусы в теории

Async/await
Плюсы

Promise
Плюсы

На примерах выше видно, что Promise субъективно является более чистым кодом. Более того я заранее заложил одну противную пакость в примерах, о которой расскажу позже. Эта особенность не позволяет выбранному нами синтаксису использовать асинхронность в полной мере. Кто её нашел сходу, может дальше не читать 🙂

Вера в обещание

Шло время, навыки оттачивались, и с тех пор я всегда пишу js-код на промисах.

А теперь о пакости.

Сложный кейс с промисами, и главное преимущество промисов — колбеки

Попалась мне интереснейшая задача «Платежная система отвечает об успешной оплате не сразу, поэтому придется слать несколько запросов в течение 30 секунд, при этом держать пользователя в режиме прелоадера, при этом если оплата пройдет раньше чем 30 секунд, то из цикла нужно выйти и отключить прелоадер, и если за 30 секунд ответа не получено, то показать ошибку».

Для удобства сопоставления алгоритма и архитектуры код совсем чуть-чуть упрощен, и совпадает с оригинальным на 90%.

На данном примере видно как используются колбэки — у нас есть полный простор в передаче ошибок в родительский промис, их множественный вызов в разных местах, когда нам необходимо. И также максимальный простор для выбора момента уведомления «родителя» об успешном окончании, тем самым мы решаем 5 пункт из запланированной архитектуры.

Требование заказчика

История закончилась бы замечательно, если бы не одно «но». ТЗ требовало, чтобы весь код был написан на async/await. Глядя на код выше можно сказать, что это достаточно сложный кейс. Первое, что можно подумать: «Это невозможно! Ведь async/await не могут ждать колбека, они только выполняют код и ничего не ждут.»

Ну хорошо… требование заказчика — закон… переписываем.

Вывод

Нет ничего хуже, чем смешение разных стилей написания кода на одном проекте. Поэтому выбирайте стайлгайд по асинхронному коду заранее. Описанный выше кейс — это редкость. И зачастую async/await будет достаточно. Но если вы чувствуете, что на проекте будут сложные кейсы и есть вероятность использования колбэков, то используйте изначально промисы, применение конструкторов Promise тоже редкость. Остальное дело вкуса.

Источник

Визуализация промисов и Async/Await

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Доброго времени суток, друзья!

Представляю вашему вниманию перевод статьи «JavaScript Visualized: Promises & Async/Await» автора Lydia Hallie.

Приходилось ли вам сталкиваться с JavaScript кодом, который… работает не так, как ожидается? Когда функции выполняются в произвольном, непредсказуемом порядке, или выполняются с задержкой. Одна из главных задач промисов — упорядочение выполнения функций.

Мое ненасытное любопытство и бессонные ночи окупились сполна — благодаря им я создала несколько анимаций. Пришло время поговорить о промисах: как они работают, почему их следует использовать и как это делается.

Введение

При написании JS кода нам часто приходится иметь дело с задачами, которые зависят от других задач. Допустим, мы хотим получить изображение, сжать его, применить к нему фильтр и сохранить его.

В результате получаем следующее:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Хм… Что-нибудь заметили? Несмотря на то, что все работает, выглядит это не лучшим образом. Мы получаем множество вложенных функций обратного вызова, зависящих от предыдущих коллбэков. Это называется адом коллбэков и это существенно усложняет чтение и поддержку кода.

К счастью, сегодня у нас есть промисы.

Синтаксис промисов

Промисы были представлены в ES6. Во многих руководствах вы можете прочитать следующее:

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

Да уж… Так себе объяснение. В свое время оно заставило меня считать промисы чем-то странным, неопределенным, какой-то магией. Чем же они являются на самом деле?

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Погодите, что здесь возвращается?

PromiseStatus или статус промиса может принимать одно из трех значений:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Посмотрим, что выводится в консоль при вызове методов resolve и reject :

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

[[PromiseValue]] или значением промиса является значение, которое мы передаем методам resolve или reject в качестве аргумента.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Во введении я привела пример, в котором мы получаем изображение, сжимаем его, применяем к нему фильтр и сохраняем его. Тогда все закончилось адом коллбэков.

К счастью, промисы помогают с этим справиться. Перепишем код так, чтобы каждая функция возвращала промис.

Если изображение загрузилось, выполняем промис. В противном случае, если произошла ошибка, отклоняем промис:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Посмотрим, что происходит при запуске этого кода в терминале:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Клево! Промис возвращается с разобранными («распарсенными») данными, как мы и ожидали.

Но… что дальше? Нас не интересует объект промиса, нас интересуют его данные. Для получения значения промиса существует 3 встроенных метода:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Наконец, мы получили искомое значение. Мы можем делать с этим значением все что угодно.

Когда мы уверены в выполнении или отклонении промиса, можно писать Promise.resolve или Promise.reject с соответствующим значением.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Именно такой синтаксис будет использоваться в следующих примерах.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Такой синтаксис выглядит гораздо лучше лестницы вложенных функций обратного вызова.

Микрозадачи и (макро)задачи

Хорошо, теперь мы знаем, как создавать промисы и как извлекать из них значения. Добавим немного кода в наш скрипт и запустим его снова:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Точно. В цикле событий (Event Loop) существует два типа очередей: очередь (макро)задач или просто задач ((macro)task queue, task queue) и очередь микрозадач или просто микрозадачи (microtask queue, microtasks).

Что относится к каждой из них? Если вкратце, то:

Сначала Task1 возвращает значение и удаляется из стека. Затем движок проверяет наличие микрозадач в соответствующей очереди. После добавления и последующего удаления из стека микрозадач, движок проверяет наличие макрозадач, которые также добавляются в стек и удаляются из него после возврата значений.

Довольно слов. Давайте писать код.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Движок видит, что стек пуст. Он «заглядывает» в очередь микрозадач. Она тоже пуста.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Готово. Теперь все встало на свои места, не правда ли?

Async/Await

В ES7 был представлен новый способ работы с асинхронным кодом в JS. С помощью ключевых слов async и await мы можем создать асинхронную функцию, неявно возвращающую промис. Но… как нам это сделать?

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Получается, что мы можем отложить выполнение асинхронной функции? Отлично, но… что это значит?

Посмотрим, что происходит при запуске следующего кода:

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

После этого выполнение асинхронной функции откладывается. Выполнение тела функции приостанавливается, оставшийся код выполняется как микрозадача.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

После того, как выполнение асинхронной функции было отложено, движок возвращается к выполнению кода в глобальном контексте.

что такое promise зачем нужен async await. image loader. что такое promise зачем нужен async await фото. что такое promise зачем нужен async await-image loader. картинка что такое promise зачем нужен async await. картинка image loader.

Получилось довольно многословно. Не переживайте, если чувствуете себя неуверенно при работе с промисами. Для того, чтобы к ним привыкнуть требуется какое-то время. Это характерно для всех приемов работы с асинхронным кодом в JS.

Спасибо за потраченное время. Надеюсь оно было потрачено не зря.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *