A declaração async function define uma função assíncrona, que retorna um objeto AsyncFunction.

Você também pode definir funções assíncronas usando uma expressão async function.

Sintaxe

async function nome([param[, param[, ... param]]]) {
   instruções
}
nome
O nome da funçao.
param
O nome de um parâmetro a ser passado para a função.
instruções
As instruções que compõem o corpo da função.

Descrição

Quando uma função assíncrona é chamada, ela retorna uma Promise. Quando a função assíncrona retorna um valor, a Promise será resolvida com o valor retornado. Quando a função assíncrona lança uma exceção ou algum valor, a Promise será rejeitada com o valor lançado.

Uma função assíncrona pode conter uma expressão await, que pausa a execução da função assíncrona e espera pela resolução da Promise passada, e depois retoma a execução da função assíncrona e retorna o valor resolvido.

A proposta das funções async/await é de simplificar o uso de forma síncrona das Promises e executar alguns procedimentos em um grupo de Promises. Assim como Promises são similares a callbacks estruturados, funções async/await são similares à junção de generators com Promises.

Exemplos

Exemplo simples

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

async function adicionar1(x) {
  var a = resolverDepoisDe2Segundos(20);
  var b = resolverDepoisDe2Segundos(30);
  return x + await a + await b;
}

adicionar1(10).then(v => {
  console.log(v);  // printa 60 depois de 2 segundos.
});

async function adicionar2(x) {
  var a = await resolverDepoisDe2Segundos(20);
  var b = await resolverDepoisDe2Segundos(30);
  return x + a + b;
}

adicionar2(10).then(v => {
  console.log(v);  // printa 60 depois de 4 segundos.
});

Reescrevendo uma cadeia de Promise com uma função async

Uma API que retorna uma Promise vai resultar em uma cadeia de Promises e separa a função em várias partes. Considere o seguinte código:

function pegarDadosProcessados(url) {
  return baixarDados(url) // retorna uma Promise
    .catch(e => {
      return baixarDadosReservas(url) // retorna uma Promise
    })
    .then(v => {
      return processarDadosNoWorker(v); // retorna uma Promise
    });
}

pode ser escrita em uma única função async desta forma:

async function pegarDadosProcessados(url) {
  let v;
  try {
    v = await baixarDados(url); 
  } catch(e) {
    v = await baixarDadosReservas(url);
  }
  return processarDadosNoWorker(v);
}

Note que no exemplo acima não tem a instrução await na instrução do return, porque o valor retornado de uma função async é implícitamente passado por um Promise.resolve.

Especificações

Especificação Situação Comentário
ECMAScript Latest Draft (ECMA-262)
The definition of 'async function' in that specification.
Padrão em tempo real Definição inicial no ES2017.

Compatibilidade de 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

Notas específicas do Firefox

Veja também

Etiquetas do documento e colaboradores

Etiquetas: 
 Colaboradores desta página: byxande, trestini, feserafim, VPagani
 Última atualização por: byxande,