Асинхронный JS

Асинхронный JS №1

then(), catch() и finally() являются по сути функциями-обработчиками, которые вы можете присоединить к конкретному экземпляру объекта обязательства для прослушивания его событий.

— Метод .then() объекта Promise добавляет обработчик, или обработчики, вызываемые когда объект Promise имеет состояние fulfilled (успешное выполнение), или rejected (выполнение отклонено).

— Метод .catch() объекта Promise добавляет обработчик или обработчики, которые будут вызваны при изменении состояния объекта Promise на rejected (выполнение отклонено).

Метод .catch() ведет себя аналогично вызову метода then() с аргументами (undefined, onRejected), он реализован таким образом, что внутренне вызывает метод then() с этими аргументами (является сокращенным вариантом метода — алиасом).

— Метод .finally() объекта Promise добавляет обработчик, который будет вызван вне зависимости от того с каким результатом объект Promise был выполнен (rejected — выполнение отклонено, или fulfilled — успешное выполнение).

Метод .finally() позволяет избежать дублирования кода в обработчиках, вызываемых когда объект Promise имеет состояние fulfilled (успешное выполнение), или rejected (выполнение отклонено), что обеспечивает возможность выполнить определенный код, когда обещание было обработано, независимо от его состояния.

В вопросе мы используем метод fetch для отправки запроса на удаленный сервер и получения данных в виде JSON. Метод fetch возвращает промис, который может обрабатываться с помощью метода then.

В примере используется 2 цепочки then, чтобы обработать ответ от сервера и вывести данные в консоль.

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

Не хватает async перед function.

В JavaScript, асинхронный код — это код, который выполняется в фоновом режиме, не задерживая выполнение основного скрипта.

В примере сразу используется fetch для получения данных с удаленного API. Вызов await приостанавливает выполнение функции, пока fetch не вернет ответ. Как только ответ получен, мы используем await для ожидания преобразования ответа в JSON. В конце выводятся данные в консоль.

Правильный ответ const data = await response.json();

response.json() – декодирует ответ в формате JSON.

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

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

В JavaScript EventLoop есть понятие приоритета.

Порядок, в котором выполняются задачи, определяется приоритетом задач. Задачи группируются в две категории: микрозадачи и макрозадачи.

Задачи с более высоким приоритетом называются микрозадачами. Например: Promise, ObjectObserver, MutationObserver, process.nextTick, async/await. Они выполняются как можно скорее.

Задачи с более низким приоритетом называются макрозадачами. Например: setTimeout, setInterval и XHR. Выполняются после завершения всех микрозадач.

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

— Сначала выполняется синхронный код, а затем асинхронный.

— Синхронный код выполняется в том порядке, в котором он был вызван.

В примере получаем что строка кода ‘ number = 9 ‘ сразу же изменяет значение number с 3 на 9, так как это синхронный код. Поэтому, когда функция, переданная в setTimeout выполняется, она использует последнее значение number, т.е. 9.

В вопросе мы получаем объект Promise, который представляет асинхронный запрос к URL, который был указан в fetch.

После получения промиса обычно используют JSON для извлечения необходимых данных.

Объект Promise предоставляет методы для обработки выполнения запроса, такие как then и catch, которые можно использовать для установки обработчиков успешного выполнения или ошибки, соответственно.

Метод finally() в JavaScript предоставляет возможность выполнить какой-то код после того, как Промис был завершен, будь то успешным или неудачным выполнением.

В примере срабатывает .then (в resolve было передано ‘World’) и .finally, поэтому получаем в консоле:

World
Промис выполнен

Когда движок JavaScript выполняет скрипт, он выполняет синхронные операции сверху вниз и затем переходит к асинхронным операциям. Поэтому script end выводится первым, а затем log1 и log2 выводятся в порядке, в котором они были добавлены в очередь.

Правильный ответ text.catch(err => console.log(err.message));

В наше случае метод .catch() перехватывает исключение, вызванное методом reject(), и печатает сообщение ошибки в консоль.

Ответом является 1 3 2.

«2» будет выведена последней, потому что она является результатом выполнения метода resolve внутри Promise. Метод resolve выполняется после того, как промис был создан и выполнены все операции внутри него. Потом, когда выполнение Promise завершено, он вызывает функцию в методе .then, которая выводит значение результата в консоль.

Правильный ответ .catch(error => console.error(error.message));

Если функция успешно выполняется, вызывается resolve с переданными данными. В нашем случае обработка успеха не производится.

Если же функция выполнена с ошибкой, вызывается reject с сообщением об ошибке.

Для обработки ошибок в Promise мы используем метод catch().

Внутри функции getData() сразу в переменную data записывается объект, потому что это синхронный код. Далее срабатывает асинхронная функция setTimeout(), которая перезаписывает свойство name. В итоге получаем в консоле именно Tom.

Правильный ответ Promise.race([firstPromise, secondPromise])

Метод Promise.race() принимает массив промисов и возвращает первый исполненный (resolved) или первый отклоненный (rejected) промис.

В вопросе мы создаем два промиса, и через Promise.race() определяем, какой из них сначала исполнится. Ответ выводится в консоль.

Правильный ответ Promise.all([promise1, promise2, promise3])

В вопросе создаётся три промиса promise1, promise2 и promise3. Далее Promise.all принимает массив промисов и возвращает один промис (только в том случае, когда будут готовы все 3 принятых). Далее в метод .then передаётся массив с результатами, которые выводятся в консоль.

Правильный ответ dataFetch().catch(error => console.log(error.message));

В примере, если возникнет ошибка, то в catch блоке мы выведем сообщение об ошибке, а затем выбросим исключение с текстом Custom error.

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