MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

Función asíncrona

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.
param
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

Cuando una función asíncrona es llamada, ella devuelve una Promise. Cuando una función asíncrona devuelve un valor, la Promise será resuelta con el valor devuelto. 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, y después continúa la ejecución de la función async y devuelve el valor resuelto.

La propuesta de las funciones async/await es simplificar el uso de forma asíncrona de las Promises y ejecutar algunos procedimientos en un grupo de Promises. Así como Promises son similares a callbacks estructurados, las funciones async/await son similares a la unión de generators con Promises.

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

Reescribiendo una cadena de Promise con una función async

Una API que devuelve una Promise resolverá una cadena de Promises y separa la función en varias partes. Considerar 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 reescrita con una única función async de esta 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)
The definition of 'async function' in that specification.
Draft Definición inicial en ES2017.

Compatibilidad en el browser

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: feserafim
 Última actualización por: feserafim,