Узнайте, как оптимизировать промисы с помощью async/await.
В предыдущем сообщении вы видели, что обещания — это прекрасно. Они представляют собой значительное улучшение по сравнению с обратными вызовами, но их интерфейсы все еще немного громоздки. Вы все еще работаете с обратными вызовами в методах. К счастью, язык продолжает совершенствоваться. Теперь вы можете полностью избежать обратных вызовов, добавив данные асинхронного промиса в переменную в одной функции.
Разработчики обычно говорят о новом синтаксисе async/await как о группе, но на самом деле это два отдельных действия. Вы используете ключевое слово async
, чтобы объявить, что инкапсулирующая функция будет использовать асинхронные данные. Внутри асинхронной функции вы можете использовать ключевое слово await
, чтобы приостановить функцию до тех пор, пока не будет возвращено значение. Я хочу отметить одну вещь: это не заменяет обещания. Вы просто заключаете обещания в лучший синтаксис.
асинхронная функция — это функция, объявленная с использованием ключевого слова async
, заставляющая функцию неявно возвращать обещание и позволяющая использовать ключевое слово await
. Асинхронные функции — это синтаксис, альтернативный цепочке вызовов Promise.then
.
Оператор ожидания указывает, что JavaScript должен дождаться выполнения промиса, прежде чем продолжить выполнение кода. Традиционно это доступно только в функциях async
, но его также можно использовать на верхнем уровне модулей.
Синтаксис
Обратите внимание на использование ключевого слова async
. Ставим его в начале объявления функции. А в случае стрелочной функции async
ставится после знака равенства и перед круглыми скобками.
// With function declaration async function myFn() { // await ... } // With arrow function const myFn = async () => { // await ... } function myFn() { // await fn(); <--- Syntax Error since there's no async }
Давайте рассмотрим простой пример. Сначала мы объявляем функцию gifts()
, которая возвращает обещание, которое разрешается в значение 🎁🎁🎁
через 3 секунды. Затем мы объявляем async
функцию msg()
и await
для разрешения промиса перед выводом сообщения на консоль.
function gifts() { return new Promise(resolve => { setTimeout(() => { resolve('🎁🎁🎁'); }, 3000); }); } async function msg() { const msg = await gifts(); console.log('Here you are:', msg); } msg(); // Here you are: 🎁🎁🎁 <-- after 3 seconds
Асинхронные функции действительно хороши, когда вы работаете с несколькими промисами. Они действительно могут очистить ваш код:
function data1() { return new Promise(resolve => { setTimeout(() => { resolve('Promises'); }, 1000); }); } function data2() { return new Promise(resolve => { setTimeout(() => { resolve('are'); }, 500); }); } function data3() { return new Promise(resolve => { setTimeout(() => { resolve('awesome!'); }, 500); }); } async function msg() { const a = await data1(); const b = await data2(); const c = await data3(); console.log(`${ a } ${ b } ${ c }`); } msg(); // Promises are awesome! <-- after 2 seconds
Мы используем промисы во многих ситуациях, но чаще всего это когда вы получаете данные из API. Целью async/await является упрощение синтаксиса, необходимого для использования API-интерфейсов на основе обещаний.
Преимущества асинхронного/ожидания
Одним из самых больших преимуществ async/await является то, что он делает ваш код намного легче для чтения, чем код, основанный на обратном вызове. Поскольку в вашем коде больше не будет вложенных обратных вызовов или промисов, он станет более организованным и понятным с первого взгляда. Кроме того, поскольку ваши функции теперь могут возвращать значения напрямую, а не полагаться на обратные вызовы или промисы, вы также можете использовать их в более традиционных контекстах программирования, таких как циклы и условия, не беспокоясь о сложных обходных путях или проблемах вложенности. Кроме того, async/await значительно упрощает обработку ошибок, поскольку ошибки, возникающие внутри асинхронной функции, автоматически перехватываются окружающим блоком try-catch (в отличие от обратных вызовов). Это значительно упрощает отладку, поскольку любые ошибки, возникающие во время выполнения, легко выявляются и соответствующим образом устраняются.
В заключение
Async/await — отличное новое дополнение к JavaScript, которое значительно упрощает работу с асинхронным кодом. Это позволяет вам писать синхронно выглядящий код, который выполняется асинхронно. Это может быть очень полезно, когда вы пытаетесь сохранить ваш код чистым и легко читаемым. Попробуйте это в своем следующем проекте!