Sintaxe da função de seta assíncrona

498

Posso marcar uma função javascript como "assíncrona" (ou seja, retornando uma promessa) com a asyncpalavra - chave. Como isso:

async function foo() {
  // do something
}

Qual é a sintaxe equivalente para funções de seta?

BonsaiOak
fonte
2
É importante notar que, pelo menos firefox e babel não deixar você fazer isso
Jaromanda X
15
var foo = async () => await Promise.resolve('ha');- funciona muito bem
Jaromanda X 22/03
2
dizer it doesn't worknão tem sentido ... você está recebendo um erro? talvez você esteja fazendo algo errado, sem o código que "não funciona" e uma descrição significativa de como ele não funciona, você pode apenas supor que você está fazendo algo errado (ou usando um navegador antigo)
Jaromanda X
1
que pode muito bem ser @Pointy, mas ela não funciona nativamente no atual Firefox e Chrome e node.js (7.7.4)
Jaromanda X
1
A especificação do ES2017 possui uma seção sobre definições de função de seta assíncrona @Pointy.
Heretic Monkey 22/03

Respostas:

844

As funções de seta assíncrona são assim:

const foo = async () => {
  // do something
}

As funções de seta assíncrona são assim para um único argumento passado a ele:

const foo = async evt => {
  // do something with evt
}

As funções de seta assíncrona são assim para vários argumentos passados ​​para ele:

const foo = async (evt, callback) => {
  // do something with evt
  // return response with callback
}

O formulário anônimo também funciona:

const foo = async function() {
  // do something
}

Uma declaração de função assíncrona se parece com isso:

async function foo() {
  // do something
}

Usando a função assíncrona em um retorno de chamada :

const foo = event.onCall(async () => {
  // do something
})
BonsaiOak
fonte
11
O OP parece estar procurando uma função de seta nomeada, assíncrona, que é a sintaxe que você não mostra.
jfriend00
48
Na verdade, const foo = async () => {}cria uma função assíncrona nomeada nomeada foo. É totalmente possível executar funções nomeadas dessa maneira (apenas sem içamento). No ES2016 +, a atribuição de uma função anônima a uma variável nomeia-a após a variável, se ela for declarada lá.
Benjamin Gruenbaum 22/03
5
@BenjaminGruenbaum Por favor, não chame isso de função nomeada. Em js, uma função anônima nomeada é uma sintaxe muito específica foo = function bar () {}criada para substituir arguments.calleeao gravar funções anônimas recursivas. O que você tem lá é uma variável chamada fooque é uma referência a uma função.
precisa saber é
18
@slebetman desde ES2015, quando const foo = async () => {}o nome da função é definido como foo- ecma-international.org/ecma-262/6.0/… e ecma-international.org/ecma-262/6.0/… - consulte a discussão em esdiscuss.org / topic /…
Benjamin Gruenbaum
1
@FarisRayhan Assim como acontece com outras constantes, a referência da variável somefunctionnão pode ser alterada depois de configurada. (Ele aponta para a sua função assíncrona anônimo.)
Qwerty
129

Essa é a maneira mais simples de atribuir uma expressão deasync função de seta a uma variável nomeada :

const foo = async () => {
  // do something
}

(Observe que isso não é estritamente equivalente a async function foo() { }. Além das diferenças entre a functionpalavra - chave e uma expressão em seta , a função nesta resposta não é "içada para o topo" .)

Edoardo L'Astorina
fonte
11
Observe que uma expressão de função nomeada é uma sintaxe muito específica em javascript. Esta NÃO é uma expressão de função nomeada. Usar as palavras certas é importante para evitar confusão mais tarde, quando uma frase pode evoluir para significar duas coisas. FYI, uma expressão de função chamado é: foo = function myName () {}. O nome é myNamee é especificado para existir apenas dentro da função anônima e não definido em nenhum lugar fora. Seu objetivo é substituir arguments.calleeao escrever funções anônimas recursivas.
precisa saber é
1
Eu estava prestes a contestar você @slebetman sobre o tecnicismo, já que esta é uma expressão de função (seta) e você acaba com uma função nomeada (ou seja foo.name === 'foo'). Mas apenas porque está no inicializador de uma constinstrução * - significando que não é certo chamar isso de "expressão de função de seta assíncrona nomeada". Você também está certo de que o nome de uma expressão de função nomeada é vinculado apenas dentro de seu próprio corpo, mas também é armazenado na namepropriedade da função , o que é bom para depuração (e é mais frequentemente o motivo pelo qual eu os nomearia).
Vaz
3
Dito de outra maneira, não existe uma "expressão de função de seta nomeada", mas ela pode se tornar "nomeada" por fazer parte de uma declaração const ou let (não tenho certeza sobre var por causa da elevação), no sentido de ter um nome fn.name, além de ter uma ligação no escopo (a variável).
Vaz
41

Função de seta assíncrona invocada imediatamente:

(async () => {
    console.log(await asyncFunction());
})();

Expressão de função assíncrona invocada imediatamente:

(async function () {
    console.log(await asyncFunction());
})();
Michael
fonte
18

Sintaxe da função Seta assíncrona com parâmetros

const myFunction = async (a, b, c) => {
   // Code here
}
codemirror
fonte
17

Exemplo básico

folder = async () => {
    let fold = await getFold();
    //await localStorage.save('folder');
    return fold;
  };
Chaurasia
fonte
13

Você também pode fazer:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}
Justin E. Samuels
fonte
4
com um parâmetro, você não precisa de parênteses. YourAsyncFunctionName = valor assíncrono => {/ * O código entra aqui * /}
Takács Zsolt