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.

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.

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.
});

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

Especificación Estado Comentario
ECMAScript Latest Draft (ECMA-262)
La definición de 'Función async' en esta especificación.
Draft Definición inicial en ES2017.
ECMAScript 2017 (ECMA-262)
La definición de 'Función async' en esta especificación.
Standard  

Compatibilidad entre navegadores

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Soporte básicoChrome Soporte completo 55Edge Soporte completo SiFirefox Soporte completo 52IE Sin soporte NoOpera Soporte completo 42Safari Soporte completo 10.1WebView Android Soporte completo SiChrome Android Soporte completo 55Edge Mobile Soporte completo SiFirefox Android Soporte completo 52Opera Android Soporte completo 42Safari iOS Soporte completo 10.1Samsung Internet Android Soporte completo 6.0nodejs Soporte completo 7.6.0
Soporte completo 7.6.0
Soporte completo 7.0.0
Deshabilitado
Deshabilitado From version 7.0.0: this feature is behind the --harmony runtime flag.

Leyenda

Soporte completo  
Soporte completo
Sin soporte  
Sin soporte
El usuario debe de habilitar explícitamente esta característica.
El usuario debe de habilitar explícitamente esta característica.

Véase también

Etiquetas y colaboradores del documento

Colaboradores en esta página: docxml, fitojb, mnax001, lexnapoles, JooseNavarro, feserafim
Última actualización por: docxml,