Zaman uyumsuz ok işlevi için sözdizimi


497

asyncAnahtar kelime ile bir javascript işlevi "zaman uyumsuz" (yani bir söz döndürme) olarak işaretleyebilirsiniz . Bunun gibi:

async function foo() {
  // do something
}

Ok işlevleri için eşdeğer sözdizimi nedir?


2
En azından firefox ve
babil'in

15
var foo = async () => await Promise.resolve('ha');- gayet iyi çalışıyor
Jaromanda X

2
diyerek it doesn't workanlamsız ... Eğer bir hata alıyorsanız? belki kodu olmadan, başka bir şey yanlış yapıyoruz "does not iş" ve iş, sadece bir şeyin yanlış yapıyor (veya eski bir tarayıcı kullanarak) olduğunuzu tahmin edebilirsiniz gelmez nasıl anlamlı bir açıklama
Jaromanda X

1
@Pointy olabilir, ancak mevcut firefox ve krom ve node.js'de yerel olarak çalışır (7.7.4)
Jaromanda X

1
ES2017 Spec zaman uyumsuz ok işlev tanımlarıyla @Pointy bir bölüm vardır.
Heretic Maymun

Yanıtlar:


842

Zaman uyumsuz ok işlevleri şöyle görünür:

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

Eşzamansız ok işlevleri , kendisine iletilen tek bir bağımsız değişken için şöyle görünür :

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

Eşzamansız ok işlevleri , kendisine iletilen birden çok bağımsız değişken için şu şekilde görünür :

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

Anonim formu sıra çalışır:

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

Zaman uyumsuz işlev bildirimi şöyle görünür:

async function foo() {
  // do something
}

Geri aramada zaman uyumsuz işlevini kullanma :

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

11
OP, göstermediğiniz bir sözdizimi olan adlandırılmış, eşzamansız bir ok işlevi arıyor gibi görünüyor.
22.07.2017

48
Aslında const foo = async () => {}adlı bir asenkron işlev oluşturur foo. Adlandırılmış işlevleri bu şekilde yapmak tamamen mümkündür (sadece kaldırma yok). ES2016 + 'da bir anonim fonksiyonun bir değişkene atanması, eğer orada bildirilirse, değişkenin adını verir.
Benjamin Gruenbaum

5
@BenjaminGruenbaum Lütfen buna function adı vermeyin. Js'de, adlandırılmış bir anonim işlev, özyinelemeli anonim işlevler yazılırken foo = function bar () {}değiştirilecek çok özel bir sözdizimidir arguments.callee. Sahip fooolduğunuz, bir işleve başvuru olan adlı bir değişken var .
slebetman

18
bunu yaptığında ES2015 beri @slebetman const foo = async () => {}işlevinin adını ayarlandığında foo- ecma-international.org/ecma-262/6.0/... ve ecma-international.org/ecma-262/6.0/... - tartışmaya bakınız esdiscuss.org / topic /…
Benjamin Gruenbaum

1
@FarisRayhan Diğer sabitlerde olduğu gibi, değişkenin referansı somefunctionayarlandıktan sonra değiştirilemez. (Anonim uyumsuz işlevinize işaret eder.)
Qwerty

129

Bir atamak Bu basit yolu asyncok fonksiyonu ifadesini a adında bir değişken:

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

( async function foo() { }Bunun kesinlikle eşdeğer olmadığını unutmayın . Anahtar kelime ve ok ifadesi arasındaki farklarınfunction yanı sıra , bu yanıttaki işlev "en üste çekilmez" .)


11
Adlandırılmış bir işlev ifadesinin javascript'te çok özel bir sözdizimi olduğunu unutmayın. Bu adlandırılmış bir işlev ifadesi DEĞİLDİR. Doğru kelimeleri kullanmak, daha sonra bir cümlenin iki anlama geldiği zaman karışıklığı önlemek için önemlidir. Bilginize, adlandırılmış işlev ifadesidir: foo = function myName () {}. Adıdır myNameve yalnızca anonim işlevi içinde var ve her yerde dışarıda tanımlanmadığı için bu belirtilmiştir. Amacı, arguments.calleeözyinelemeli anonim işlevler yazarken değiştirmektir .
slebetman

1
Slebetman'ı teknik olarak tartışmak üzereydim, çünkü bu bir (ok) işlev ifadesi ve sonunda adlandırılmış bir işlevle (yani foo.name === 'foo') sonuçlanır . Ancak, yalnızca bir const* ifadesinin * başlatıcısında olduğu için - buna "asenkron ok fonksiyonu ifadesi adı" vermek doğru değildir. Ayrıca, adlandırılmış bir işlev ifadesinin adının yalnızca kendi gövdesi içinde bağlı olduğunu, ancak namehata ayıklama için güzel olan işlevin özelliğinde de saklanır (ve daha sık olarak onları adlandırmamın nedeni budur).
Vaz

3
Başka bir deyişle, "adlandırılmış ok işlevi ifadesi" diye bir şey yoktur, ancak bir const veya let ifadesinin (kaldırma nedeniyle var olduğundan emin değilim) bir parçası olarak "adlandırılmış" olabilir . bir ad fn.namehem de kapsamına bağlanması (değişken) sahip olmasıdır.
Vaz

41

Hemen Çağırılan Asenkron Ok İşlevi:

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

Hemen Çağrılan Asenkron Fonksiyon İfadesi:

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

18

Async Arrow işlevi sözdizimi ve parametreler

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

17

Temel Örnek

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

13

Ayrıca şunları da yapabilirsiniz:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

4
bir param ile parantez gerekmez. AsyncFunctionName = async değeri => {/ * Kod buraya gelir * /}
Takács Zsolt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.