Async/await и Promises – это способы выполнения асинхронного кода в Javascript. Они написаны и структурированы по-разному и имеют свои определенные преимущества и недостатки, когда дело доходит до вариантов использования.
Обещания
Промисы появились в ECMAScript 2015 и использовались для обработки асинхронного кода. Он использует ключевое слово .then и .catch, которое обрабатывает как успехи, так и ошибки в коде, а также позволяет разработчикам связывать несколько асинхронных операций в одном интерфейсе.
const fetchData = () => { | |
return fetch('https://api.example.com') | |
.then(response => response.json()) | |
.then(data => { | |
console.log(data) | |
} | |
}) |
Выглядит довольно просто?
Что, если мы сможем сделать его более понятным?
Асинхронно/ждите
async/await появился в ECMAScript 2017 и поддерживается во всех современных браузерах. Он используется для запуска асинхронного кода, но написан и структурирован как код в синхронном стиле с использованием ключевых слов async и await.
const fetchData = async () => { | |
const response = await fetch('https://api.example.com/api'); | |
const data = await response.json() | |
console.log(data) | |
} |
Выглядит лучше ? верно.
Почему Async/await лучше?
По причинам, указанным ниже, мы можем использовать этот фрагмент кода:
// Using async/await | |
const fetchData = async () => { | |
try { | |
const response = await fetch("https://api.example.com/api") | |
const data = await response.json() | |
console.log(data) | |
}catch(err) => { | |
console.log(err) | |
} | |
} | |
// Using promise chain | |
const fetchData = () => { | |
return fetch("https://api.example.com/api") | |
.then(response => response.json()) | |
.then(data => console.log(data)) | |
.catch(err => console.error(err)); | |
} |
- Читаемость
Код, написанный в async/await, имеет синхронную структуру, что упрощает работу с асинхронным кодом. Одним из наиболее важных навыков разработчика является умение писать чистый, оптимизированный и читабельный код.
Async/await предоставляет более краткие и простые строки кода, которые назначаются переменной, делает их доступными без необходимости цепочки промисов. Кроме того, их легче отлаживать и поддерживать.
2. Обработка ошибок и отладка
Async/await необходимо обернуть внутри блока try/catch, чтобы обрабатывать как успехи, так и ошибки в коде. Вы также можете использовать отладчик, чтобы приостановить выполнение функции в определенный момент, чтобы понять, как обещание разрешается или отклоняется.
В то время как для обещаний это позволяет нам поместить обработчик ошибок в конец цепочки обещаний. Огромным недостатком использования отладчика в цепочке обещаний является объем, поскольку выполнение останавливается только там, где встречается «отладчик».
Использование отладчика в нативных промисах — беспорядок, так как вы должны быть точны при размещении точек останова в цепочке промисов.
Просто взглянув на код, подход с использованием async/await, завернутый в блок try/catch, более организован, поэтому его легче отлаживать.
3. Обработка нескольких значений
Нативное обещание
// Handling multiple values | |
const fetchData = () => { | |
return fetch('/api/data') | |
.then(response => response.json()) | |
.then(data => { | |
return fetch(`/api/data/${data.id}`) | |
.then(response => response.json()) | |
.then(user => console.log(user)); | |
}); | |
} |
Обработка нескольких значений в этой цепочке промисов довольно проста, но очень легко потеряться в коде с таким количеством отступов, скобок и прочего. И сложнее определить точки останова для запуска отладчика.
Асинхронно/ждите
const fetchData = () => { | |
try { | |
const response = await fetch('/api.example.com/data'); | |
const data = await response.json(); | |
const ApiResponse = await fetch(`/api/data/${data.id}`); | |
const user = await ApiResponse.json(); | |
return { data, user }; | |
} catch (err) { | |
console.error(err); | |
} | |
} |
Использование async/await для обработки нескольких значений делает строки кода простыми, организованными и читабельными.
Подводные камни
- Совместимость с браузерами: Async/await — это относительно новая языковая функция Javascript, которая может поддерживаться только современными браузерами. В то время как обещания существуют дольше и используются более широко.
- Ошибки/трассировки стека: обработка ошибок в async/await может быть не такой точной, как обработка ошибок с помощью промисов. Ошибки в функции async/await выдаются в другом контексте, в то время как Promises использует catch в конце цепочки обещаний, что является более гибким и точным.
- Обработка нескольких асинхронных операций. Собственные промисы обеспечивают более чистый синтаксис при обработке нескольких асинхронных операций с использованием метода
Promise.all
. Async/await в этом случае может стать слишком многословным.
Вывод :
Использование async/await вместо нативного обещания зависит от предпочтений каждого разработчика. Возможно, существуют более старые кодовые базы, которые все еще написаны в собственном методе обещания, поскольку async/await являются новыми и могут поддерживаться только современными браузерами.
Если вы не обрабатываете несколько асинхронных операций и думаете об эффективности и организации, вам лучше использовать async/await.