Async — это ключевое слово, которое может помочь вам сделать ваш асинхронный код более асинхронным.

Ниже приведен пример асинхронной грубости.

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

Что мы хотим сделать как клиент этого поддельного приложения, так это создать новую публикацию и увидеть публикацию, которую мы сделали. Однако, как вы можете видеть, войдя в терминал, когда мы публикуем сообщение, а затем получаем сообщения, мы получаем только старые сообщения, а не те, которые мы только что сделали. Это связано с тем, что код выполняется асинхронно, а инициация и завершение публикации занимает больше времени, чем получение. В реальных условиях мы не знаем, сколько времени займет любая из этих операций. Попытка выяснить причину того, как код не работает синхронно, может быть чрезвычайно запутанной или сложной для понимания и учета новичком-программистом.

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

Что я сделал, так это то, что наш запрос на получение всегда будет срабатывать после того, как наше сообщение будет отправлено на поддельный сервер. Мы изменили fakePostRequest, чтобы принимать newPost, но также и обратный вызов. Когда мы передаем fakeGetRequest, наш fakePostRequest вызывает его только после выполнения его кода.

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

Здесь мы используем объект Promise для создания более разборчивого и синхронного кода. Наш fakePostRequest теперь возвращает обещание, которое выполняет тот же код и использует разрешение и отклонение. Объект обещания — это просто объект, представляющий состояние синхронной функции (независимо от того, была ли она запущена или не удалась и т. д.). Итак, как вы используете значение? Вы просто вызываете функцию, а затем используете метод .then() при вызове функции. Это принимает функцию, которой будет присвоено значение resolve(), которое вы передаете.

Если обещание, которое вы делаете, обнаруживает ошибку и вызывается reject(), оно передаст значение функции, которую вы передаете в свой .catch() так же, как .then().

Теперь, когда я объяснил промисы и то, почему вы будете их использовать, я покажу вам новый пример кода, объясняющий ключевое слово async. Здесь у нас есть две функции; findIngredient, которая находит заданный ингредиент из объекта, и функцию makeSandwich, которая объединяет некоторые ингредиенты и возвращает их в виде массива.

Однако вы можете заметить, что хотя findIngredient возвращает строку, makeSandwich создает и возвращает массив объектов-обещаний. Это из-за ключевого слова async! Ключевое слово async делает так, что асинхронная функция возвращает объект обещания, который будет разрешаться в возврат асинхронной функции после ее асинхронного запуска в цикле событий. Однако приведенный выше код не очень синхронен. Как мы можем заставить makeSandwich использовать реальные значения, а не объекты промисов? Мы используем ключевое слово await!

Ключевое слово async позволяет использовать в нем ключевое слово await! Await — это ключевое слово, которое сообщает коду «Подождите, пока это обещание не будет разрешено для продолжения. Здесь я сделал makeSandwich асинхронной функцией и использовал .then() для регистрации результата нашего возврата. Как видите, я использую ключевое слово await, чтобы заставить функцию приостанавливаться и оценивать наши обещания, прежде чем возвращать новое. Затем он регистрирует разрешение промиса makeSandwich.

Вот об этом!

Есть несколько важных методов, которые должна использовать функция Promise, такие как .all() и .race(), которые могут помочь с такими вещами, как скорость и время, о которых вы должны узнать больше из MDN!