web-dev-qa-db-ja.com

非同期/待機ネイティブ実装

この提案 は、async関数が内部でジェネレーター関数を使用できることを示唆していますが、ES2017仕様ではこれの確認を見つけることができません。

さらに、ジェネレータプロトタイプがChrome/Node.jsでめちゃくちゃになっても、async関数は影響を受けないようです。これは、GeneratorFunctionAsyncFunctionによって使用されていないことを示唆しています、少なくとも直接:

Object.getPrototypeOf((function * () {}).prototype).next = null;

(async () => {
    return await Promise.resolve(1);
})()
.then(console.log);

async/awaitは、既存のネイティブ実装でどのように機能しますか?

実装は、提案によって提案され、通常BabelとTypeScriptで実装されているPromise/generator関数アプローチで可能になるよりもパフォーマンスが優れていますか?

18
Estus Flask

私が知る限り、ジェネレータ関数はasync/awaitの動作を模倣するために使用されます。 TypeScriptを使用すると、JavaScriptにコンパイルされ、セットアップに応じて、async/await構文をジェネレーターの実装にコンパイルします。

ここでのコンパイルの詳細: https://basarat.gitbooks.io/TypeScript/docs/async-await.html

したがって、TypeScriptでそれらを使用することについて心配する必要はまったくありません。

ネイティブ実装ではジェネレータを使用しないと思います。基本的には、promiseを処理するための単なる構文シュガーである必要があります。

1
Martin Adámek