Синтаксис для функции асинхронной стрелки

499

Я могу пометить функцию javascript как «асинхронную» (т.е. возвращающую обещание) с asyncключевым словом. Нравится:

async function foo() {
  // do something
}

Каков эквивалентный синтаксис для функций стрелок?

BonsaiOak
источник
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.
Еретик Обезьяна

Ответы:

847

Асинхронные функции стрелок выглядят так:

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

Асинхронные функции стрелок выглядят следующим образом для одного передаваемого аргумента :

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

Асинхронные функции стрелок выглядят так для нескольких передаваемых аргументов :

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
})
BonsaiOak
источник
11
Похоже, что OP ищет именованную, асинхронную функцию стрелки, которая является единственным синтаксисом, который вы не показываете.
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 () => {
    console.log(await asyncFunction());
})();

Сразу же вызывается выражение асинхронной функции:

(async function () {
    console.log(await asyncFunction());
})();
Майкл
источник
18

Синтаксис функции асинхронной стрелки с параметрами

const myFunction = async (a, b, c) => {
   // Code here
}
CodeMirror
источник
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