2017-10-24 19 views
5

This proposalは、asyncファンクションでは、ES2017仕様でこれを確認することはできませんが、ファンクションでジェネレータ機能を使用できることを示しています。非同期/ネイティブ実装を待つ

はまた、発電機プロトタイプはクロム/ Node.jsのに台無しになると、async機能が影響されていないようだ、これはGeneratorFunctionは、少なくとも直接、AsyncFunctionによって使用されていないことを示唆している:

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

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

async/awaitは、既存のネイティブ実装ではどのくらい正確に動作しますか?

Promise /提案機能で提案されているジェネレータ機能のアプローチよりも実装が優れていて、通常はBabelとTypeScriptで実装されていますか?

+0

私は 'async-await'は約束事で全く同じメカニズムを使用していますが、コンパイラによって異なる構文解析をしていると思います。それらのネイティブ実装の前に、ジェネレータと約束を使用してasync-awaitに似た抽象概念(非同期的な非同期コード)を得ることができます(https://curiosity-driven.org/promises-and-generators)。 – Redu

答えて

0

私が知る限り、ジェネレータ関数は、async/awaitの振る舞いを模倣するために使用されます。 typescriptを使用すると、javascriptにコンパイルされ、設定に応じて、async/await構文をジェネレータの実装にコンパイルします。ここでのコンパイルについて

より:https://basarat.gitbooks.io/typescript/docs/async-await.html

だから、私は考えるすべてのtypescriptですでそれらを使用して心配してはいけません。

私はネイティブの実装ではジェネレータを使用していないと思われますが、これは基本的には約束で作業するための構文砂糖でなければなりません。

+0

はい、ネイティブ実装(低レベル)に関する質問です。私は彼らがジェネレータ+約束のコンストラクタよりも効率的かどうか疑問に思います。 – estus

4

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

我々は明確に非同期待つ実装の明白な根拠として約束と発電機の両方を見ることができ、実際のnative implementation of async await in v8を見れば、またparserで、それは明らかに非同期のawaitを脱糖の発電機 - 約束の本質を述べています。

ES仕様に関しては、仕様が実行コンテキスト切り替えの実際の実装を直接言及していないにもかかわらず、Promise.resolveが使用している同じPerform ! Call(promiseCapability.[[Resolve]]メカニズムの使用を示唆しています。したがって実行可能なコンテキスト・トグルをasyncContextの実行に対処するための可能な「メカニズム」を主観的に示唆しています。

発電機プロトタイプはクロム/ Node.jsのに台無しになったときまた、非同期機能は影響を受けないようで、これは、少なくとも直接、GeneratorFunctionをAsyncFunctionによって使用されていないことを示唆している:

ランタイムで

両方generatorasync機能がFunctionオブジェクトの子孫である、彼らはあなたがコミットされた変更が表示されない理由です、しかし互いから継承しません。

しかし、特定のホストオブジェクトまたはメソッドの実際のネイティブレベルの実装は、コンパイルされた対応オブジェクトおよびその依存関係の実行時実行に必ずしも接続する必要はありません。Function.prototype.call =() => {}%call%はネイティブレベルの実装であるためです。

プロポーザルで提案され、通常BabelとTypeScriptで実装されているプロミス/ジェネレータ関数のアプローチよりも実装が優れていますか?

これは、JSエンジンに依存し、それはコンパイルレベルの最適化とdeoptimizationsを実装していますが、それは連続的な変化、時にはネイティブ実装はit happened with es5 map, forEach vs lodash counterpartsのように、サードパーティ製のlibに実装より遅いの対象だが、ほとんどの場合、ネイティブレベルの実装であります機械コードに1つのレベルが近づいているために比類のないものです。一例として、jsperf with 2x prevalence of async-await over regeneratorがバーベルで使用されています。