Składnia funkcji strzałki asynchronicznej

496

Mogę oznaczyć funkcję javascript jako „asynchroniczną” (tzn. Zwracającą obietnicę) asyncsłowem kluczowym. Lubię to:

async function foo() {
  // do something
}

Jaka jest równoważna składnia funkcji strzałek?

Dąb Bonsai
źródło
2
Warto zauważyć, że przynajmniej firefox i babel na to pozwalają
Jaromanda X
15
var foo = async () => await Promise.resolve('ha');- działa dobrze
Jaromanda X
2
powiedzenie it doesn't workjest bez znaczenia ... czy pojawia się błąd? być może robisz coś innego źle, bez kodu, który „nie działa” i sensowny opis tego, jak to nie działa, możesz jedynie zgadywać, że robisz coś źle (lub używasz starej przeglądarki)
Jaromanda X
1
może to być @Pointy, ale działa natywnie w obecnym firefoxie i chrome oraz node.js (7.7.4)
Jaromanda X
1
Specyfikacja ES2017 zawiera sekcję dotyczącą definicji funkcji strzałek asynchronicznych @Pointy.
Heretic Monkey

Odpowiedzi:

840

Funkcje strzałek asynchronicznych wyglądają następująco:

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

Funkcje strzałek asynchronicznych wyglądają tak dla jednego przekazanego argumentu :

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

Funkcje strzałek asynchronicznych wyglądają tak dla wielu przekazanych do niej argumentów :

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

Anonimowy formularz działa również:

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

Deklaracja funkcji asynchronicznej wygląda następująco:

async function foo() {
  // do something
}

Używanie funkcji asynchronicznej w wywołaniu zwrotnym :

const foo = event.onCall(async () => {
  // do something
})
Dąb Bonsai
źródło
11
Wygląda na to, że OP szuka nazwanej funkcji asynchronicznej strzałki, która jest składnią, której nie wyświetlasz.
jfriend00
48
W rzeczywistości const foo = async () => {}tworzy nazwaną funkcję asynchroniczną o nazwie foo. W ten sposób można w pełni wykonywać funkcje nazwane (po prostu bez podnoszenia). W ES2016 + przypisanie funkcji anonimowej do zmiennej nazywa ją po zmiennej, jeśli jest tam zadeklarowana.
Benjamin Gruenbaum
5
@BenjaminGruenbaum Nie nazywaj go nazwaną funkcją. W js nazwana funkcja anonimowa jest bardzo specyficzną składnią, foo = function bar () {}która została utworzona w celu zastąpienia arguments.calleepodczas pisania rekurencyjnych funkcji anonimowych. To, co masz, to zmienna o nazwie, fooktóra jest odwołaniem do funkcji.
slebetman
18
@slebetman od ES2015, kiedy robisz, const foo = async () => {}nazwa funkcji jest ustawiona na foo- ecma-international.org/ecma-262/6.0/... i ecma-international.org/ecma-262/6.0/... - patrz dyskusja na esdiscuss.org / topic /…
Benjamin Gruenbaum
1
@FarisRayhan Podobnie jak w przypadku innych stałych, odniesienia zmiennej somefunctionnie można zmienić po jej ustawieniu. (Wskazuje na twoją anonimową funkcję asynchroniczną).
Qwerty
129

To najprostszy sposób przypisania wyrażeniaasync funkcji strzałki do nazwanej zmiennej:

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

(Zauważ, że nie jest to ściśle równoważne async function foo() { }. Oprócz różnic między functionsłowem kluczowym a wyrażeniem strzałki , funkcja w tej odpowiedzi nie jest „podniesiona do góry” .)

Edoardo L'Astorina
źródło
11
Zauważ, że nazwane wyrażenie funkcyjne jest bardzo specyficzną składnią w javascript. To NIE jest nazwane wyrażenie funkcyjne. Używanie właściwych słów jest ważne, aby uniknąć nieporozumień, gdy jedno zdanie może ewoluować i oznaczać dwie rzeczy. FYI, nazwany wyrażenie funkcji jest następująca: foo = function myName () {}. Nazwa ma na myNamecelu istnienie tylko wewnątrz funkcji anonimowej i nie jest zdefiniowana nigdzie na zewnątrz. Jego celem jest zastąpienie arguments.calleepodczas pisania rekurencyjnych funkcji anonimowych.
slebetman
1
Właśnie miałem spierać się z tobą @slebetman o techniczność, ponieważ jest to wyrażenie funkcji (strzałka), a ty otrzymujesz funkcję o nazwie (tj foo.name === 'foo'.). Ale tylko dlatego, że znajduje się on w inicjalizatorze const* instrukcji * - co oznacza, że ​​nie jest właściwe nazywać to „nazwanym wyrażeniem funkcji asynchronicznej strzałki”. Masz również rację, że nazwa nazwanego wyrażenia funkcji jest związana tylko w jego własnym ciele, ale jest także przechowywana we właściwości funkcji name, co jest przydatne do debugowania (i częściej jest to powód, dla którego je nazywam).
Vaz
3
Innymi słowy, nie ma czegoś takiego jak „nazwane wyrażenie funkcji strzałki”, ale może ono zostać nazwane przez bycie częścią instrukcji const lub let (nie jestem pewien co do var z powodu podnoszenia), w sensie posiadania nazwa fn.nameoraz posiadające powiązanie w zakresie (zmienna).
Vaz
41

Natychmiast wywołana funkcja strzałki asynchronicznej:

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

Wywołane natychmiast wyrażenie asynchroniczne:

(async function () {
    console.log(await asyncFunction());
})();
Michał
źródło
18

Składnia funkcji strzałki asynchronicznej z parametrami

const myFunction = async (a, b, c) => {
   // Code here
}
kodemirror
źródło
17

Podstawowy przykład

folder = async () => {
    let fold = await getFold();
    //await localStorage.save('folder');
    return fold;
  };
Chaurasia
źródło
13

Możesz także:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}
Justin E. Samuels
źródło
4
za pomocą jednego parametru nie potrzebujesz nawiasu. YourAsyncFunctionName = wartość asynchroniczna => {/ * Kod idzie tutaj * /}
Takács Zsolt