Sintaks untuk fungsi panah async

498

Saya dapat menandai fungsi javascript sebagai "async" (yaitu mengembalikan janji) dengan asynckata kunci. Seperti ini:

async function foo() {
  // do something
}

Apakah sintaks setara untuk fungsi panah?

BonsaiOak
sumber
2
Perlu dicatat bahwa setidaknya firefox dan babel memungkinkan Anda melakukan itu
Jaromanda X
15
var foo = async () => await Promise.resolve('ha');- bekerja dengan baik
Jaromanda X
2
mengatakan it doesn't worktidak ada artinya ... apakah Anda mendapatkan kesalahan? mungkin Anda melakukan sesuatu yang salah, tanpa kode yang "tidak berfungsi" dan deskripsi yang bermakna tentang bagaimana itu tidak berfungsi, hanya dapat menebak bahwa Anda melakukan sesuatu yang salah (atau menggunakan browser lama)
Jaromanda X
1
itu mungkin @Pointy, tetapi bekerja secara native di firefox saat ini dan chrome dan node.js (7.7.4)
Jaromanda X
1
The ES2017 spek memiliki bagian definisi async panah fungsi @Pointy.
Bidah Monyet

Jawaban:

844

Fungsi panah Async terlihat seperti ini:

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

Fungsi panah Async terlihat seperti ini untuk satu argumen yang diteruskan ke sana:

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

Fungsi panah Async terlihat seperti ini untuk beberapa argumen yang diteruskan ke sana:

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

Bentuk anonim juga berfungsi:

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

Deklarasi fungsi async terlihat seperti ini:

async function foo() {
  // do something
}

Menggunakan fungsi async dalam panggilan balik :

const foo = event.onCall(async () => {
  // do something
})
BonsaiOak
sumber
11
OP tampaknya mencari fungsi panah bernama, async, yang merupakan salah satu sintaks yang tidak Anda tampilkan.
jfriend00
48
Sebenarnya, const foo = async () => {}membuat fungsi bernama async bernama foo. Sangat mungkin untuk melakukan fungsi bernama dengan cara ini (hanya tanpa mengangkat). Dalam ES2016 + penugasan fungsi anonim ke nama variabel itu setelah variabel jika dideklarasikan di sana.
Benjamin Gruenbaum
5
@BenjaminGruenbaum Tolong jangan sebut itu namanya fungsi. Dalam js, fungsi anonim bernama adalah sintaksis foo = function bar () {}yang sangat spesifik yang dibuat untuk menggantikan arguments.calleesaat menulis fungsi anonim rekursif. Apa yang Anda miliki di sana adalah variabel bernama fooyang merupakan referensi ke suatu fungsi.
slebetman
18
@slebetman sejak ES2015 ketika Anda melakukan const foo = async () => {}nama fungsi diatur ke foo- ecma-international.org/ecma-262/6.0/… dan ecma-international.org/ecma-262/6.0/… - lihat diskusi di esdiscuss.org / topic / ...
Benjamin Gruenbaum
1
@FarisRayhan Seperti halnya konstanta lain, referensi variabel somefunctiontidak dapat diubah setelah disetel. (Ini menunjuk ke fungsi async anonim Anda.)
Qwerty
129

Ini cara termudah untuk menetapkan ekspresiasync fungsi panah ke variabel bernama :

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

(Perhatikan bahwa ini tidak sepenuhnya setara dengan async function foo() { }. Selain perbedaan antara functionkata kunci dan ekspresi panah , fungsi dalam jawaban ini tidak "diangkat ke atas" .)

Edoardo L'Astorina
sumber
11
Perhatikan bahwa ekspresi fungsi bernama adalah sintaks yang sangat spesifik dalam javascript. Ini BUKAN ekspresi fungsi bernama. Menggunakan kata-kata yang tepat adalah penting untuk menghindari kebingungan di kemudian hari ketika satu kalimat dapat berevolusi menjadi dua hal. FYI, bernama ekspresi fungsi: foo = function myName () {}. Namanya myNamedan ditentukan hanya ada di dalam fungsi anonim dan tidak didefinisikan di mana pun di luar. Tujuannya adalah untuk mengganti arguments.calleeketika menulis fungsi anonim rekursif.
slebetman
1
Saya akan menyengketakan Anda @slebetman tentang masalah teknis, karena ini adalah ekspresi fungsi (panah) dan Anda berakhir dengan fungsi bernama (yaitu foo.name === 'foo'). Tetapi hanya karena itu adalah inisialisasi dari constpernyataan * * —berarti itu tidak tepat untuk menyebutnya "ekspresi fungsi panah async bernama". Anda juga benar bahwa nama ekspresi fungsi bernama hanya terikat di dalam tubuhnya sendiri, tetapi juga disimpan di nameproperti fungsi , yang bagus untuk debugging (dan lebih sering menjadi alasan saya menamai mereka).
Vaz
3
Dengan kata lain, tidak ada "ekspresi fungsi panah bernama", tetapi bisa menjadi "dinamai" dengan menjadi bagian dari sebuah konst atau membiarkan pernyataan (tidak yakin tentang var karena mengangkat), dalam arti memiliki nama fn.nameserta memiliki cakupan yang mengikat (variabel).
Vaz
41

Fungsi Panah Async Segera Diaktifkan:

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

Ekspresi Fungsi Async Segera Dibawa:

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

Async Arrow berfungsi sintaksis dengan parameter

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

Contoh dasar

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

Anda juga dapat melakukan:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}
Justin E. Samuels
sumber
4
dengan satu param Anda tidak perlu tanda kurung. YourAsyncFunctionName = nilai async => {/ * Kode di sini * /}
Takács Zsolt