先ほど async 関数
について読んだところ、ES2017 にも同様の機能がいくつか見つかりました。多くの混乱を引き起こしているので、一つお聞きしたいのですが:
async function
、AsyncFunction
(非同期関数の作成に使用)、および非同期関数式 (これも別の非同期関数だと思います) の違いは何ですか? 皆さんの癖やパフォーマンスのハイライトを大歓迎です。
P粉2877263082024-03-26 00:44:29
JavaScript で関数を作成するには 4 つの方法があります。 JavaScript で非同期関数を作成する方法も 4 つあり、これらは互いに完全にミラーリングされています。
これがどのように機能するかを示すために、グローバルに宣言された単純な sleep
関数を使用しました。
リーリー
関数宣言は、
async 関数が常に Promise を返し、
await を使用できる点を除いて、非同期関数宣言とまったく同じです。
関数式は、
async 関数が常に Promise を返し、
await を使用できる点を除いて、非同期関数式とまったく同じです。
アロー関数は、ES2015 (ES6) で導入された関数を定義するための迅速かつ短い方法です。これらは、常に匿名であること、this の値が常に字句的に束縛されること、つまり外部スコープから継承されることを除いて、ほとんどの点で関数式と同等です。
async 関数が常に Promise を返し、
await を使用できる点を除いて、非同期アロー関数とまったく同じです。 (各非同期関数内に複数のステートメントがあるため、上記のステートメントとは若干異なります。つまり、これらのステートメントはブロック
{} と
return に含める必要があります。これは、1 つのステートメントよりも長い通常のアロー関数にも当てはまります。)
まれな状況でのみ役に立ちます。個人的には、非同期関数コンストラクターは役に立たないと思います。 AsyncFunction はグローバル オブジェクトではなく、最初に const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
を使用して取得する必要があるため、ES2017 の作者も私に同意しています。
関数コンストラクターを使用して作成された関数は、
関数が常に Promise を返し、await
を使用できることを除いて、匿名関数コンストラクターを使用して作成された関数とまったく同じです。 (でも、もうお分かりでしょう?)