Función async
Baseline Widely 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ón async
define una función asíncrona, la cual devuelve un objeto AsyncFunction
.
Es posible definir también funciones asíncronas a través de una expresión de función async.
Pruébalo
The source for this interactive demo is stored in a GitHub repository. If you'd like to contribute to the interactive demo project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
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 objeto AsyncFunction
, 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ón async
, esta devuelve un elemento Promise
. Cuando la función async
devuelve un valor, Promise
se resolverá con el valor devuelto. Si la función async
genera una excepción o algún valor, Promise
se rechazará con el valor generado.
Una función async
puede contener una expresión await
, la cual pausa la ejecución de la función asíncrona y espera la resolución de la Promise
pasada y, a continuación, reanuda la ejecución de la función async
y devuelve el valor resuelto.
Nota:
La finalidad de las funciones async
/await
es simplificar el comportamiento del uso síncrono de promesas y realizar algún comportamiento específico en un grupo de Promises
. Del mismo modo que las Promises
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 confundir await
y Promise.all
En add1
, la ejecución se suspende durante dos segundos correspondientes al primer operador await
, y luego durante otros dos segundos correspondientes al segundo await
. El segundo temporizador no se crea hasta que el primero no se haya disparado ya. En add2
, ambos temporizadores se crean y, acto seguido, ambos reciben await
. Esto provoca la resolución en dos segundos y no cuatro, ya que los temporizadores se ejecutaron de manera simultánea. Sin embargo, ambas llamadas await
aún pueden ejecutarse en series, no en paralelo: esto no constituye ninguna aplicación automática de Promise.all
. Si se desea aplicar await
a dos o más promesas en paralelo, es preciso utilizar Promise.all
.
Reescritura de una cadena de promesas con una función async
Una API que devuelva una Promise
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 operador async
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ón await
dentro de la instrucción return
, porque el valor de retorno de una async function
queda implícitamente dentro de un Promise.resolve
.
Especificaciones
Specification |
---|
ECMAScript Language Specification # sec-async-function-definitions |
Compatibilidad con navegadores
BCD tables only load in the browser