--- title: Funções assíncronas slug: Web/JavaScript/Reference/Statements/async_function tags: - Função - assíncrono translation_of: Web/JavaScript/Reference/Statements/async_function original_slug: Web/JavaScript/Reference/Statements/funcoes_assincronas ---
A declaração async function
define uma função assíncrona, que retorna um objeto {{jsxref("Global_Objects/AsyncFunction","AsyncFunction")}}.
Você também pode definir funções assíncronas usando uma {{jsxref("Operators/async_function", "expressão async function")}}.
async function nome([param[, param[, ... param]]]) { instruções }
nome
param
instruções
Quando uma função assíncrona é chamada, ela retorna uma {{jsxref("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 {{jsxref("Operators/await", "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 P
romises
.
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. });
Promise
com uma função async
Uma API que retorna uma {{jsxref("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 {{jsxref("Promise.resolve")}}.
Especificação | Situação | Comentário |
---|---|---|
{{SpecName('ESDraft', '#sec-async-function-definitions', 'async function')}} | {{Spec2('ESDraft')}} | Definição inicial no ES2017. |