Синтаксис функції стрілки асинхронізації


496

Я можу позначити функцію javascript як "async" (тобто повернення обіцянки) за допомогою asyncключового слова. Подобається це:

async function foo() {
  // do something
}

Який еквівалентний синтаксис функцій стрілок?


2
Варто зазначити, що принаймні firefox та babel дозволяють вам це зробити
Jaromanda X

15
var foo = async () => await Promise.resolve('ha');- працює просто чудово
Jaromanda X

2
приказка it doesn't workбезглузда ... ви отримуєте помилку? можливо ви робите щось не так, без коду, який "не працює" та змістовного опису того, як це не працює, можна лише здогадуватися, що ви робите щось не так (або використовуєте старий браузер)
Jaromanda X

1
це може бути @Pointy, але це працює на самому світі в поточному firefox та chrome та node.js (7.7.4)
Jaromanda X

1
Специфікація ES2017 має розділ про визначення функції асинхронної стрілки @Pointy.
Єретична мавпа

Відповіді:


841

Функції стрілки асинхронізації виглядають приблизно так:

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

Функції стрілки Async виглядають так для одного аргументу, переданого йому:

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

Функції стрілки Async виглядають так для декількох переданих йому аргументів :

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

Також працює анонімна форма:

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

Декларація функції асинхронізації виглядає приблизно так:

async function foo() {
  // do something
}

Використання функції асинхронізації в зворотному дзвінку :

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

11
ОП, здається, шукає названу, асинхронізовану функцію стрілки, яка є одним із синтаксисів, який ви не показуєте.
jfriend00

48
Насправді, const foo = async () => {}створюється названа функція асинхронізації з іменем foo. Цілком можливо зробити іменовані функції таким чином (просто без підйому). У ES2016 + присвоєння анонімної функції змінній називає її змінною, якщо вона там оголошена.
Бенджамін Груенбаум

5
@BenjaminGruenbaum Будь ласка, не називайте його іменованою функцією. У js названа анонімна функція - це дуже специфічний синтаксис, foo = function bar () {}який було створено для заміни arguments.calleeпід час запису рекурсивних анонімних функцій. У вас є змінна назва, fooяка є посиланням на функцію.
slebetman

18
@slebetman з ES2015, коли ви робите const foo = async () => {}ім'я функції, встановлено на foo: ecma-international.org/ecma-262/6.0/… та ecma-international.org/ecma-262/6.0/… - див. дискусію на esdiscuss.org / тема /…
Бенджамін Грюнбаум

1
@FarisRayhan Так само, як і для інших констант, посилання змінної somefunctionне можна змінити після її встановлення. (Це вказує на вашу функцію анонімної асинхронізації.)
Qwerty

129

Це найпростіший спосіб , щоб призначити asyncфункцію стрілки вираз до імені змінної:

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

(Зауважте, що це не є рівнозначним async function foo() { }. Окрім відмінностей між functionключовим словом та виразом стрілки , функція у цій відповіді не "піднята на вершину" .)


11
Зауважте, що іменований вираз функції є дуже специфічним синтаксисом у JavaScript. Це НЕ названий вираз функції. Використання правильних слів важливо, щоб уникнути плутанини пізніше, коли одна фраза може розвиватися і означати дві речі. FYI, пойменоване вираз функції: foo = function myName () {}. Ім'я є, myNameі воно вказане, що воно існує лише всередині анонімної функції і не визначене ніде зовні. Його мета полягає в заміні arguments.calleeпри написанні рекурсивних анонімних функцій.
slebetman

1
Я збирався оскаржувати вас @slebetman щодо технічності, оскільки це вираз (стрілка) функції, і ви закінчуєте іменовану функцію (тобто foo.name === 'foo'). Але тільки тому, що він знаходиться в ініціалізаторі constоператора * *, тобто це не зовсім правильно називати це вираженням "з назвою функції асинхронної стрілки". Ви також правдиві, що ім'я вираженої функції функції прив’язане лише до власного тіла, але воно також зберігається у nameвластивості функції , що підходить для налагодження (і частіше є причиною того, що я б їх назвав).
Ваз

3
Іншими словами, немає такого поняття , як «вираз функції по імені стрілки», але він може стати « під назвою» будучи частиною константної або нехай заяву (не впевнений , вар з - за підйому), в тому сенсі, що ім'я fn.name, а також має прив'язку за обсягом (змінна).
Ваз

41

Функція стрілки Async негайно викликана:

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

Вираз виразу функції асинхронізації:

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

18

Синтаксис функцій стрілки Async Arrow з параметрами

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

17

Основний приклад

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

13

Ви також можете зробити:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

4
з однією парамою вам не потрібні дужки. YourAsyncFunctionName = async value => {/ * Код йде сюди * /}
Takács Zsolt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.