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


499

Я могу пометить функцию javascript как «асинхронную» (т.е. возвращающую обещание) с 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.
— Еретик Обезьяна

Ответы:


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
})

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
}

17

Основной пример

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.