Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

La declaración async function define una función asíncrona, que devuelve un objeto AsyncFunction.

También puedes definir funciones asíncronas usando una declaración async function.

Sintaxis

async function nombre([parámetro[, parámetro[, ... parámetro]]]) {
   instrucciones
}
nombre
El nombre de la función.
parámetro
El nombre del parámetro para ser pasado en la función.
instrucciones
Las instrucciones que componen el cuerpo de la función.

Valor de retorno

Un objeto AsyncFunction, representando una función asincrónica que ejecuta el código contenido dentro de la función.

Descripción

Al llamar una función asíncrona, esta devuelve una Promise. Cuando una función asíncrona devuelve un valor, la Promise se resuelve con dicho valor. Cuando una función asíncrona lanza una excepción o algún valor, la Promise será rechazada con el valor lanzado.

Una función asíncrona puede contener una expresión await, que detiene la ejecución de la función asíncrona y espera la resolución de la Promise pasada, continuando después la ejecución de la función async y devolviendo el valor resuelto. 

Las funciones async/await buscan simplificar el uso de promesas de manera síncrona y ejecutar procedimientos en un grupo de Promises. De igual manera que las promesas se asemejan a callbacks estructurados,  async/await es similar a combinar generadores y promesas.

Ejemplos

Ejemplo básico

function resolverDespuesDe2Segundos(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function añadir1(x) {
  var a = resolverDespuesDe2Segundos(20);
  var b = resolverDespuesDe2Segundos(30);
  return x + await a + await b;
}

añadir1(10).then(v => {
  console.log(v);  // muestra en consola 60 después de 2 segundos.
});

async function añadir2(x) {
  var a = await resolverDespuesDe2Segundos(20);
  var b = await resolverDespuesDe2Segundos(30);
  return x + a + b;
}

añadir2(10).then(v => {
  console.log(v);  // muestra en consola 60 después de 4 segundos.
});

No confundir await con Promise.all

añadir1 tarda 4 segundos: la ejecución se suspende 2 segundos para el primer await, y otros 2 segundos para el segundo await. El segundo temporizador no se crea hasta que el primero se resuelve. En cambio, añadir2 tarda 2 segundos, debido a que los temporizadores se ejecutan concurrentemente: ambos temporizadores se crean, y ambos se esperan con await. Si se quiere esperar en paralelo dos o más promesas con await, se debe seguir usando Promise.all.

Reescribiendo una cadena de Promise con una función async

Una API que devuelve una Promise da lugar a una cadena de promesas, y separa la función en varias partes. Considera el siguiente código:

function obtenerDatosProcesados(url) {
  return descargarDatos(url) // devuelve una Promise
    .catch(e => {
      return obtenerDatosReservas(url) // devuelve una Promise
    })
    .then(v => {
      return procesarDatosEnWorker(v); // devuelve una Promise
    });
}

puede ser reescrito con una única función async de la siguiente forma:

async function obtenerDatosProcesados(url) {
  let v;
  try {
    v = await descargarDatos(url); 
  } catch(e) {
    v = await obtenerDatosReservas(url);
  }
  return procesarDatosEnWorker(v);
}

Nótese que el ejemplo anterior no tiene la instrucción await en la instrucción return, debido a que el valor devuelto por una función async se pasa implícitamente a través de Promise.resolve.

Especificaciones

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

Compatibilidad en navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Feature Chrome Firefox (Gecko) Internet Explorer  Edge Opera Safari (WebKit)
Basic support 55 52.0 (52.0) ? ? 42 10.1
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support (Yes) (Yes) 52.0 (52.0) ? 42 10.1 55

Véase también

Etiquetas y colaboradores del documento

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