Esta página ha sido traducida del inglés por la comunidad.Aprende más y únete a la comunidad de MDN Web Docs.
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 abril de 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.
In this article
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
nameEl nombre de la función.
paramEl nombre de un argumento que se debe pasar a la función.
statementsLas 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> |