非同期矢印関数の構文


498

asyncキーワードを使用して、JavaScript関数に「非同期」(つまり、Promiseを返す)のマークを付けることができます。このような:

async function foo() {
  // do something
}

矢印関数の同等の構文は何ですか?


2
少なくともfirefoxとbabelではそれができることは注目に値します
ジャロマンダ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矢印非同期のセクションがあります。
異端者モンキー

回答:


844

非同期矢印関数は次のようになります。

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は、表示されない構文の1つである、名前付きの非同期矢印関数を探しているようです。
jfriend00

48
実際にconst foo = async () => {}は、という名前の非同期関数を作成しますfoo。この方法で名前を付けた関数を実行することは完全に可能です(巻き上げなし)。ES2016 +では、変数への無名関数の割り当ては、そこで宣言されている場合、変数にちなんで名前を付けます。
Benjamin Gruenbaum 2017年

5
@BenjaminGruenbaum関数という名前を付けないでください。jsでは、名前付き無名関数は、再帰的な無名関数をfoo = function bar () {}作成するarguments.calleeときに置き換えるために作成された非常に特定の構文です。あなたが持っているのはfoo、関数への参照であるという名前の変数です。
slebetman 2017年

18
あなたはES2015以来@slebetman const foo = async () => {}関数の名前に設定されてfoo- ecma-international.org/ecma-262/6.0/...ecma-international.org/ecma-262/6.0/... -での議論を参照esdiscuss.orgを/ topic /…
Benjamin Gruenbaum 2017年

1
@FarisRayhan他の定数と同様に、変数の参照somefunctionは設定後に変更できません。(匿名の非同期関数を指します。)
Qwerty

129

これは、名前付き変数にasyncアロー関数を割り当てる最も簡単な方法です。

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

(これはと厳密に同等ではないことに注意してくださいasync function foo() { }キーワードと矢印式の違いにfunction加え、この回答の関数は「上に移動」していません。)


11
名前付き関数式は、JavaScriptの非常に具体的な構文であることに注意してください。これは名前付き関数式ではありません。正しい単語を使用することは、1つのフレーズが2つのことを意味するように進化する可能性があるときに混乱を避けるために重要です。参考までに、名前付き関数式は次のとおりfoo = function myName () {}です。名前はmyName、無名関数の内部にのみ存在し、外部のどこにも定義されないように指定されています。その目的は、arguments.callee再帰的な匿名関数を作成するときに置き換えることです。
slebetman 2017年

1
これは(矢印)関数式であり、名前付きの関数(つまりfoo.name === 'foo')になるため、専門知識について@slebetmanに異議を唱えようとしていました。ただし、これはconst* statement *の初期化子に含まれているため、これを「名前付き非同期矢印関数式」と呼ぶのは適切ではないということです。また、名前付き関数式の名前はそれ自体の本体内にのみバインドされていることも正しいですが、関数のnameプロパティにも格納されているため、デバッグに適しています(多くの場合、名前を付けた理由です)。
Vaz

3
言い換えると、「名前付き矢印関数式」などはありませんが、constまたはlet ステートメントの一部にすることで「名前付き」にできます(巻き上げのためにvarについては不明)。名前fn.nameとスコープ内のバインディング(変数)。
Vaz

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.