Async/await en TypeScript
Este artículo explica async/await en TypeScript.
YouTube Video
Async/await en TypeScript
En TypeScript, async
es una palabra clave para describir de forma concisa operaciones asíncronas y se comporta de manera similar a la sintaxis async
/await
de JavaScript. Las funciones async
están diseñadas para hacer que el manejo de funciones que retornan Promesas sea más intuitivo.
Conceptos básicos de las funciones async
Las funciones declaradas con la palabra clave async
siempre retornan una Promise
. Aquí hay un ejemplo básico:.
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
En este ejemplo, debido a que la función async
siempre retorna una Promise
, el valor retornado se resuelve automáticamente usando Promise.resolve
. En otras palabras, "Data received"
se convierte en una Promise<string>
y es tratada como una operación asíncrona.
La palabra clave await
La palabra clave await
solo puede usarse dentro de una función async
. Esto permite pausar y esperar el resultado de una Promise
antes de continuar con la ejecución de la función.
En el siguiente ejemplo, el procesamiento asíncrono usando fetch
se escribe con 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();
En este ejemplo, se utiliza await
para esperar la finalización de la Promise
retornada por la función fetch
, y su resultado se asigna a la variable response
. Además, también se espera el resultado de response.json()
.
Manejo de errores con async
/await
Los errores que ocurren durante el procesamiento asíncrono se pueden capturar utilizando la sintaxis estándar de try...catch
. Si ocurre un error en la parte await
, ese error se maneja en el bloque 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();
En el ejemplo anterior, el resultado de la función fetch
se espera utilizando await
, y si ocurre un error, se maneja con try...catch
.
Ventajas de async
/await
-
Procesamiento asíncrono intuitivo: Al usar
async
/await
, el flujo del código es más intuitivo que al usar cadenas dePromise
(then
ocatch
), permitiendo que se escriba como si fuera procesamiento sincrónico. -
Manejo de errores fácil: Usar
try...catch
simplifica el manejo de errores en operaciones asíncronas. Puedes escribir un código más legible que al usar cadenas dePromise
.
Valores de retorno de las funciones async
Una función async
siempre devuelve un Promise
. Por lo tanto, incluso sin devolver explícitamente un Promise
, el procesamiento asincrónico es posible utilizando la palabra clave async
.
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
En el código anterior, se devuelve un valor sincrónico 42
, pero como está dentro de una función async
, se convierte automáticamente en Promise.resolve(42)
.
Ejecución Secuencial de Funciones Asincrónicas
Al ejecutar varias funciones asincrónicas sucesivamente, puedes usar await
para controlar su orden.
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();
En este ejemplo, fetchData2
se ejecuta después de esperar a que fetchData1
se complete. Esto es más legible en comparación con el uso de una cadena de Promise
.
Ejecución Paralela
Si deseas ejecutar operaciones asincrónicas en paralelo, puedes usar Promise.all
para manejar múltiples Promises
simultáneamente.
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();
En este caso, fetchData1
y fetchData2
se ejecutan al mismo tiempo, y el proceso continúa después de que ambos se resuelvan. Esto permite manejar eficientemente múltiples operaciones asincrónicas.
Resumen
- Una función
async
devuelve unPromise
, y al usar la palabra claveawait
, puedes esperar el resultado de una operación asincrónica. - Al usar
try...catch
, el manejo de errores en operaciones asincrónicas se vuelve más sencillo. - Al usar
Promise.all
, es posible ejecutar múltiples operaciones asincrónicas en paralelo.
async
/await
se utiliza ampliamente en TypeScript y JavaScript porque permite una descripción más simple de las operaciones asincrónicas.
Puedes seguir el artículo anterior utilizando Visual Studio Code en nuestro canal de YouTube. Por favor, también revisa nuestro canal de YouTube.