Función async
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
La declaración de funciónasync
define unafunción asíncrona, la cual devuelve un objetoAsyncFunction
.
Es posible definir también funciones asíncronas a través de unaexpresión de función async.
Pruébalo
function resolveAfter2Seconds() { return new Promise((resolve) => { setTimeout(() => { resolve("resolved"); }, 2000); });}async function asyncCall() { console.log("calling"); const result = await resolveAfter2Seconds(); console.log(result); // Expected output: "resolved"}asyncCall();
Sintaxis
async function name([param[, param[, ... param]]]) { statements}
Parámetros
name
El nombre de la función.
param
El nombre de un argumento que se debe pasar a la función.
statements
Las declaraciones que conforman el cuerpo de la función.
Valor de retorno
Un objetoAsyncFunction
, que representa una función asíncrona que ejecuta el código contenido dentro de la función.
Descripción
Cuando se llama a una funciónasync
, esta devuelve un elementoPromise
. Cuando la funciónasync
devuelve un valor,Promise
se resolverá con el valor devuelto. Si la funciónasync
genera una excepción o algún valor,Promise
se rechazará con el valor generado.
Una funciónasync
puede contener una expresiónawait
, la cual pausa la ejecución de la función asíncrona y espera la resolución de laPromise
pasada y, a continuación, reanuda la ejecución de la funciónasync
y devuelve el valor resuelto.
Nota:La finalidad de las funcionesasync
/await
es simplificar el comportamiento del uso síncrono de promesas y realizar algún comportamiento específico en un grupo dePromises
. Del mismo modo que lasPromises
son semejantes a las devoluciones de llamadas estructuradas,async
/await
se asemejan a una combinación de generadores y promesas.
Ejemplos
Ejemplo sencillo
function resolveAfter2Seconds(x) { return new Promise((resolve) => { setTimeout(() => { resolve(x); }, 2000); });}async function add1(x) { const a = await resolveAfter2Seconds(20); const b = await resolveAfter2Seconds(30); return x + a + b;}add1(10).then((v) => { console.log(v); // prints 60 after 4 seconds.});async function add2(x) { const p_a = resolveAfter2Seconds(20); const p_b = resolveAfter2Seconds(30); return x + (await p_a) + (await p_b);}add2(10).then((v) => { console.log(v); // prints 60 after 2 seconds.});
Advertencia:No se deben confundirawait
yPromise.all
Enadd1
, la ejecución se suspende durante dos segundos correspondientes al primer operadorawait
, y luego durante otros dos segundos correspondientes al segundoawait
. El segundo temporizador no se crea hasta que el primero no se haya disparado ya. Enadd2
, ambos temporizadores se crean y, acto seguido, ambos recibenawait
. Esto provoca la resolución en dos segundos y no cuatro, ya que los temporizadores se ejecutaron de manera simultánea. Sin embargo, ambas llamadasawait
aún pueden ejecutarse en series, no en paralelo: estono constituye ninguna aplicación automática dePromise.all
. Si se desea aplicarawait
a dos o más promesas en paralelo, es preciso utilizarPromise.all
.
Reescritura de una cadena de promesas con una funciónasync
Una API que devuelva unaPromise
tendrá como resultado una cadena de promesas, y dividirá la función en muchas partes. Estudie este código:
function getProcessedData(url) { return downloadData(url) // returns a promise .catch((e) => { return downloadFallbackData(url); // returns a promise }) .then((v) => { return processDataInWorker(v); // returns a promise });}
Es posible reescribirlo utilizando un solo operadorasync
de esta manera:
async function getProcessedData(url) { let v; try { v = await downloadData(url); } catch (e) { v = await downloadFallbackData(url); } return processDataInWorker(v);}
Observe que, en el ejemplo anterior, no hay ninguna instrucciónawait
dentro de la instrucciónreturn
, porque el valor de retorno de unaasync function
queda implícitamente dentro de unPromise.resolve
.
Especificaciones
Specification |
---|
ECMAScript® 2026 Language Specification # sec-async-function-definitions |