Async/await no TypeScript
Este artigo explica async/await no TypeScript.
YouTube Video
Async/await no TypeScript
No TypeScript, async
é uma palavra-chave usada para descrever operações assíncronas de forma concisa e se comporta de maneira similar à sintaxe async
/await
do JavaScript. As funções async
são projetadas para tornar mais intuitivo o tratamento de funções que retornam Promises.
Noções básicas de funções async
Funções declaradas com a palavra-chave async
sempre retornam uma Promise
. Aqui está um exemplo básico:.
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
Neste exemplo, como a função async
sempre retorna uma Promise
, o valor retornado é automaticamente resolvido usando Promise.resolve
. Em outras palavras, "Data received"
se torna uma Promise<string>
e é tratada como uma operação assíncrona.
A palavra-chave await
A palavra-chave await
só pode ser usada dentro de uma função async
. Isso permite pausar e esperar pelo resultado de uma Promise
antes de continuar com a execução da função.
No exemplo a seguir, o processamento assíncrono usando fetch
é escrito com async
/await
.
1async function getUserData() {
2 try {
3 const response = await fetch("https://codesparklab.com/json/example.json");
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("Error fetching user data:", error);
8 }
9}
10
11getUserData();
Neste exemplo, await
é usado para esperar a conclusão da Promise
retornada pela função fetch
, e seu resultado é atribuído à variável response
. Além disso, o resultado de response.json()
também é aguardado.
Tratamento de Erros com async
/await
Erros que ocorrem durante o processamento assíncrono podem ser capturados usando a sintaxe padrão try...catch
. Se ocorrer um erro na parte await
, esse erro é tratado no bloco catch
.
1async function fetchDataWithErrorHandling() {
2 try {
3 const response = await fetch('https://invalid.codesparklab.com/');
4 if (!response.ok) {
5 throw new Error(`HTTP error! status: ${response.status}`);
6 }
7 const data = await response.json();
8 console.log(data);
9 } catch (error) {
10 console.error("Fetch error:", error);
11 }
12}
13
14fetchDataWithErrorHandling();
No exemplo acima, o resultado da função fetch
é esperado usando await
e, se ocorrer um erro, ele é tratado com try...catch
.
Vantagens de async
/await
-
Processamento assíncrono intuitivo: Usando
async
/await
, o fluxo do código é mais intuitivo do que usar cadeias dePromise
(then
oucatch
), permitindo que seja escrito de forma parecida com o processamento síncrono. -
Tratamento de erros simplificado: Usar
try...catch
simplifica o tratamento de erros em operações assíncronas. Você pode escrever um código mais legível do que usando cadeias dePromise
.
Valores de Retorno de Funções async
Uma função async
sempre retorna uma Promise
. Portanto, mesmo sem retornar explicitamente uma Promise
, o processamento assíncrono é possível usando a palavra-chave async
.
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
No código acima, um valor síncrono 42
é retornado, mas como está dentro de uma função async
, ele é automaticamente convertido para Promise.resolve(42)
.
Execução Sequencial de Funções Assíncronas
Ao executar várias funções assíncronas em sequência, você pode usar await
para controlar sua ordem.
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function processData() {
19 const data1 = await fetchData1();
20 console.log(data1);
21
22 const data2 = await fetchData2();
23 console.log(data2);
24}
25
26processData();
Neste exemplo, fetchData2
é executado após aguardar a conclusão de fetchData1
. Isso é mais legível em comparação ao uso de uma cadeia de Promises
.
Execução Paralela
Se você quiser executar operações assíncronas em paralelo, pode usar Promise.all
para lidar com várias Promises
simultaneamente.
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function fetchMultipleData() {
19 const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
20 console.log(data1);
21 console.log(data2);
22}
23
24fetchMultipleData();
Nesse caso, fetchData1
e fetchData2
são executados ao mesmo tempo, e o processo continua após ambas serem resolvidas. Isso permite um tratamento eficiente de várias operações assíncronas.
Resumo
- Uma função
async
retorna umaPromise
, e ao usar a palavra-chaveawait
, você pode aguardar o resultado de uma operação assíncrona. - Ao usar
try...catch
, o tratamento de erros em operações assíncronas se torna mais simples. - Ao usar
Promise.all
, é possível executar várias operações assíncronas em paralelo.
async
/await
é amplamente usado em TypeScript e JavaScript porque permite uma descrição mais simples de operações assíncronas.
Você pode acompanhar o artigo acima usando o Visual Studio Code em nosso canal do YouTube. Por favor, confira também o canal do YouTube.