AsyncFunction

AsyncFunction コンストラクターは、新しい非同期関数オブジェクトを生成します。 JavaScript では、すべての非同期関数が実際に AsyncFunction オブジェクトです。

AsyncFunction はグローバルオブジェクトではないことに注意してください。これは以下のようなコードで取得することができます。

Object.getPrototypeOf(async function(){}).constructor

構文

new AsyncFunction([arg1[, arg2[, ...argN]],] functionBody)

引数

arg1, arg2, ... argN
形式的な引数名として関数に使用される名前です。それぞれが有効な JavaScript の識別子であるか、カンマで区切った文字列のリストで、例えば "x", "theValue", "a,b" などです。
functionBody
関数定義を構成する JavaScript 文を含む文字列。

解説

AsyncFunction コンストラクターで生成された非同期関数オブジェクトは、関数が生成されたときにパースされます。これは、非同期関数を非同期関数式で定義してからコード内で呼び出す方法ほど効率的ではありません。というのも、そのような関数はコードの残りの部分と共にパースされるからです。

関数に渡されたすべての引数は、渡された順に、作成される関数内の引数の識別子の名前として扱われます。

注: 非同期関数AsyncFunction コンストラクターによって生成された場合、生成コンテキストのクロージャは生成されません。常にグローバルスコープに生成されます。

実行すると、ローカル変数とグローバルグローバル変数にのみアクセスでき、 AsyncFunction コンストラクターが呼び出されたスコープの変数にはアクセスできません。

これは、非同期関数式のコードで eval を使用した場合とは異なります。

AsyncFunction コンストラクターを (new 演算子を使用せずに) 関数として呼び出した場合、コンストラクターとして呼び出したときと同じ効果があります。

AsyncFunction() コンストラクターから非同期関数を生成する

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

let AsyncFunction = Object.getPrototypeOf(async function(){}).constructor

let a = new AsyncFunction('a', 
                          'b', 
                          'return await resolveAfter2Seconds(a) + await resolveAfter2Seconds(b);');

a(10, 20).then(v => {
  console.log(v); // prints 30 after 4 seconds
});

仕様書

仕様書
ECMAScript (ECMA-262)
AsyncFunction object の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
AsyncFunctionChrome 完全対応 55Edge 完全対応 15Firefox 完全対応 52IE 未対応 なしOpera 完全対応 42Safari 完全対応 10.1WebView Android 完全対応 55Chrome Android 完全対応 55Firefox Android 完全対応 52Opera Android 完全対応 42Safari iOS 完全対応 10.3Samsung Internet Android 完全対応 6.0nodejs 完全対応 7.6.0
完全対応 7.6.0
完全対応 7.0.0
無効
無効 From version 7.0.0: this feature is behind the --harmony runtime flag.

凡例

完全対応  
完全対応
未対応  
未対応
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

関連情報