Sintassi per la funzione della freccia asincrona


498

Posso contrassegnare una funzione JavaScript come "asincrono" (ovvero restituire una promessa) con la asyncparola chiave. Come questo:

async function foo() {
  // do something
}

Qual è la sintassi equivalente per le funzioni freccia?


2
Vale la pena notare che almeno Firefox e Babel ti consentono di farlo
Jaromanda X

15
var foo = async () => await Promise.resolve('ha');- Funziona benissimo
Jaromanda X

2
dire non ha it doesn't worksenso ... stai ricevendo un errore? forse stai sbagliando qualcos'altro, senza il codice che "non funziona" e una descrizione significativa di come non funziona, puoi solo supporre che stai facendo qualcosa di sbagliato (o usando un vecchio browser)
Jaromanda X

1
potrebbe essere @Pointy, ma funziona nativamente negli attuali firefox, chrome e node.js (7.7.4)
Jaromanda X

1
Le specifiche ES2017 hanno una sezione sulle definizioni delle funzioni delle frecce asincrone @Pointy.
Heretic Monkey,

Risposte:


844

Le funzioni delle frecce asincrone si presentano così:

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

Le funzioni delle frecce asincrone si presentano così per un singolo argomento passato ad esso:

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

Le funzioni delle frecce asincrone si presentano così per più argomenti passati ad esso:

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

Anche la forma anonima funziona:

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

Una dichiarazione di funzione asincrona è simile alla seguente:

async function foo() {
  // do something
}

Utilizzo della funzione asincrona in un callback :

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

11
L'OP sembra cercare una funzione di freccia denominata, asincrona, che è l'unica sintassi che non si mostra.
jfriend00,

48
In realtà, const foo = async () => {}crea una funzione asincrona denominata denominata foo. È del tutto possibile eseguire funzioni nominate in questo modo (semplicemente senza sollevamento). In ES2016 + assegnazione di una funzione anonima a una variabile la nomina dopo la variabile se viene dichiarata lì.
Benjamin Gruenbaum,

5
@BenjaminGruenbaum Per favore, non chiamarla funzione denominata. In js, una funzione anonima denominata è una sintassi molto specifica foo = function bar () {}creata per sostituire arguments.calleequando si scrivono funzioni anonime ricorsive. Quello che hai lì è una variabile denominata fooche è un riferimento a una funzione.
Slebetman,

18
@slebetman da ES2015 quando fai const foo = async () => {}il nome della funzione è impostato su foo- ecma-international.org/ecma-262/6.0/… e ecma-international.org/ecma-262/6.0/… - vedi discussione in esdiscuss.org / topic /…
Benjamin Gruenbaum,

1
@FarisRayhan È proprio come con altre costanti, il riferimento della variabile somefunctionnon può essere modificato dopo che è stato impostato. (Indica la tua funzione asincrona anonima.)
Qwerty

129

Questo è il modo più semplice per assegnare un'espressione dellaasync funzione freccia a una variabile denominata :

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

(Si noti che questo non è strettamente equivalente a async function foo() { }. Oltre alle differenze tra la functionparola chiave e un'espressione di freccia , la funzione in questa risposta non è "sollevata in alto" .)


11
Si noti che un'espressione di funzione denominata è una sintassi molto specifica in JavaScript. Questa NON è un'espressione di funzione denominata. L'uso delle parole giuste è importante per evitare confusione in seguito quando una frase può evolvere per significare due cose. Cordiali saluti, un'espressione di funzione con nome è: foo = function myName () {}. Il nome è myNameed è specificato che esiste solo all'interno della funzione anonima e non è definito da nessuna parte all'esterno. Lo scopo è sostituire arguments.calleequando si scrivono funzioni anonime ricorsive.
Slebetman,

1
Stavo per contestare te @slebetman sul tecnicismo, dato che questa è un'espressione di funzione (freccia) e tu finisci con una funzione denominata (cioè foo.name === 'foo'). Ma solo perché è constnell'inizializzatore di un'istruzione * *, quindi non è del tutto corretto chiamarla "espressione della funzione di freccia asincrona denominata". Hai anche ragione sul fatto che il nome di un'espressione di funzione denominata è associato solo al suo stesso corpo, ma è anche memorizzato nella nameproprietà della funzione , che è utile per il debug (ed è più spesso la ragione per cui li nominerei).
Vaz,

3
Per dirla in altro modo, non esiste una "espressione della funzione freccia denominata", ma può diventare "nominata" facendo parte di un'istruzione const o let (non sono sicuro di var a causa del sollevamento), nel senso di avere un nome fn.nameoltre ad avere un vincolo nell'ambito (la variabile).
Vaz,

41

Funzione freccia asincrona immediatamente richiamata:

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

Espressione della funzione asincrona immediatamente richiamata:

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

18

Sintassi della funzione Freccia asincrona con parametri

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

17

Esempio di base

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

13

Puoi anche fare:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

4
con un parametro non è necessaria la parentesi. YourAsyncFunctionName = async value => {/ * Il codice va qui * /}
Takács Zsolt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.