Syntax für die asynchrone Pfeilfunktion

497

Ich kann eine Javascript-Funktion mit dem asyncSchlüsselwort als "asynchron" markieren (dh ein Versprechen zurückgeben) . So was:

async function foo() {
  // do something
}

Was ist die äquivalente Syntax für Pfeilfunktionen?

BonsaiOak
quelle
2
Es ist erwähnenswert, dass zumindest Firefox und Babel Sie das tun lassen
Jaromanda X
15
var foo = async () => await Promise.resolve('ha');- funktioniert gut
Jaromanda X
2
Sprichwort it doesn't workist bedeutungslos ... bekommen Sie einen Fehler? Vielleicht machen Sie etwas anderes falsch, ohne den Code, der "nicht funktioniert" und eine aussagekräftige Beschreibung, wie es nicht funktioniert, können Sie nur vermuten, dass Sie etwas falsch machen (oder einen alten Browser verwenden)
Jaromanda X
1
das mag zwar @Pointy sein, aber es funktioniert nativ in aktuellem Firefox und Chrome und node.js (7.7.4)
Jaromanda X
1
Die ES2017-Spezifikation enthält einen Abschnitt zu Funktionsdefinitionen für asynchrone Pfeile @Pointy.
Heretic Monkey

Antworten:

843

Async Pfeil Funktionen wie folgt aussehen:

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

Async arrow Funktionen für eine so aussehen einziges Argument an sie übergeben:

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

Async arrow Funktionen wie folgt aussehen für mehrere Argumente an sie übergeben:

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

Das anonyme Formular funktioniert auch:

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

Ein asynchroner Funktion Erklärung sieht wie folgt aus :

async function foo() {
  // do something
}

Verwenden der asynchronen Funktion in einem Rückruf :

const foo = event.onCall(async () => {
  // do something
})
BonsaiOak
quelle
11
Das OP scheint nach einer benannten, asynchronen Pfeilfunktion zu suchen, die die Syntax ist, die Sie nicht anzeigen.
jfriend00
48
const foo = async () => {}Erstellt tatsächlich eine benannte asynchrone Funktion mit dem Namen foo. Es ist durchaus möglich, benannte Funktionen auf diese Weise auszuführen (nur kein Heben). In ES2016 + benennt die Zuweisung einer anonymen Funktion zu einer Variablen diese nach der Variablen, wenn sie dort deklariert ist.
Benjamin Gruenbaum
5
@BenjaminGruenbaum Bitte nenne es nicht Named Function. In js ist eine benannte anonyme Funktion eine sehr spezifische Syntax foo = function bar () {}, die arguments.calleebeim Schreiben rekursiver anonymer Funktionen ersetzt wurde. Was Sie dort haben, ist eine Variable mit dem Namen foo, die auf eine Funktion verweist.
Slebetman
18
@slebetman seit ES2015, wenn Sie const foo = async () => {}den Namen der Funktion ausführen, wird auf foo- ecma-international.org/ecma-262/6.0/… und ecma-international.org/ecma-262/6.0/… gesetzt - siehe Diskussion in esdiscuss.org / topic /…
Benjamin Gruenbaum
1
@FarisRayhan Wie bei anderen Konstanten kann die Referenz der Variablen somefunctionnach dem Festlegen nicht mehr geändert werden. (Es zeigt auf Ihre anonyme asynchrone Funktion.)
Qwerty
129

Dies ist der einfachste Weg , um einen zuweisen asyncPfeil Funktion Ausdruck auf eine benannte Variable:

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

(Beachten Sie, dass dies nicht unbedingt gleichbedeutend ist mit async function foo() { }. Abgesehen von den Unterschieden zwischen dem functionSchlüsselwort und einem Pfeilausdruck wird die Funktion in dieser Antwort nicht "nach oben gehoben" .)

Edoardo L'Astorina
quelle
11
Beachten Sie, dass ein benannter Funktionsausdruck eine sehr spezifische Syntax in Javascript ist. Dies ist KEIN benannter Funktionsausdruck. Die Verwendung der richtigen Wörter ist wichtig, um später Verwirrung zu vermeiden, wenn sich eine Phrase zu zwei Dingen entwickeln kann. Zu Ihrer Information, ein benannter Funktionsausdruck lautet : foo = function myName () {}. Der Name ist myNameund es wird angegeben, dass er nur innerhalb der anonymen Funktion existiert und nirgendwo außerhalb definiert ist. Es soll ersetzt werden, arguments.calleewenn rekursive anonyme Funktionen geschrieben werden.
Slebetman
1
Ich wollte Sie @slebetman wegen der Technik bestreiten, da dies ein (Pfeil-) Funktionsausdruck ist und Sie am Ende eine benannte Funktion (dh foo.name === 'foo') haben. Aber nur, weil es sich um den Initialisierer einer const* Anweisung * handelt - was bedeutet, dass es nicht ganz richtig ist, dies als "benannten asynchronen Pfeilfunktionsausdruck" zu bezeichnen. Sie haben auch Recht, dass der Name eines benannten Funktionsausdrucks nur in seinem eigenen Körper gebunden ist, sondern auch in der nameEigenschaft der Funktion gespeichert ist , was sich gut zum Debuggen eignet (und häufiger der Grund ist, warum ich sie benenne).
Vaz
3
Anders ausgedrückt, es gibt keinen "benannten Pfeilfunktionsausdruck", aber er kann "benannt" werden, indem er Teil einer const- oder let- Anweisung ist (wegen des Hebens nicht sicher über var), im Sinne von einen Namen fn.namesowie eine Bindung im Bereich (die Variable).
Vaz
41

Sofort aufgerufene asynchrone Pfeilfunktion:

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

Sofort aufgerufener asynchroner Funktionsausdruck:

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

Asynchrone Pfeilfunktionssyntax mit Parametern

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

Grundlegendes Beispiel

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

Sie können auch tun:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}
Justin E. Samuels
quelle
4
Mit einem Parameter benötigen Sie keine Klammern. YourAsyncFunctionName = async value => {/ * Code geht hierher * /}
Takács Zsolt