Funções assíncronas
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
A declaraçãoasync function
define umafunção assíncrona, que retorna um objetoAsyncFunction
.
Você também pode definir funções assíncronas usando umaexpressão async function
.
Sintaxe
async function nome([param[, param[, ... param]]]) { instruções}
nome
O nome da função.
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 umaPromise
. Quando a função assíncrona retorna um valor, aPromise
será resolvida com o valor retornado. Quando a função assíncrona lança uma exceção ou algum valor, aPromise
será rejeitada com o valor lançado.
Uma função assíncrona pode conter uma expressãoawait
, que pausa a execução da função assíncrona e espera pela resolução daPromise
passada, e depois retoma a execução da função assíncrona e retorna o valor resolvido.
Nota:A proposta das funçõesasync/await
é de simplificar o uso de forma síncrona dasPromises
e executar alguns procedimentos em um grupo dePromises
. Assim comoPromises
são similares acallbacks
estruturados, funçõesasync/await
são similares à junção degenerators
comPromises
.
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); // exibe 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); // exibe 60 depois de 4 segundos.});
Reescrevendo uma cadeia dePromise
com uma funçãoasync
Uma API que retorna umaPromise
vai resultar em uma cadeia dePromises
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çãoasync
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çãoawait
na instrução doreturn
, porque o valor retornado de uma funçãoasync
é implícitamente passado por umPromise.resolve
.
Especificações
Specification |
---|
ECMAScript® 2026 Language Specification # sec-async-function-definitions |
Compatibilidade com navegadores
Notas específicas do Firefox
- A funçãoexpression closure syntax não é permitida com funções assíncronas e irão lançar a exceçãoSyntaxError a partir do Firefox 55.