ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript コンストラクターで Async/Await を使用できないのはなぜですか?

JavaScript コンストラクターで Async/Await を使用できないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-27 20:39:15
オリジナル
939 人が閲覧しました

Why Can't Async/Await Be Used in JavaScript Constructors?

コンストラクター内での非同期呼び出し: 不可能な試み

async/await を使用した非同期プログラミングは一般的になりましたが、コンストラクター関数内でのその適用は興味深い挑戦です。次のコード スニペットを考えてみましょう:

customElements.define('e-mail', class extends HTMLElement {
  async constructor() {
    super()

    let uid = this.getAttribute('data-uid')
    let message = await grabUID(uid)

    const shadowRoot = this.attachShadow({mode: 'open'})
    shadowRoot.innerHTML = `
      <div>
ログイン後にコピー

残念ながら、このコードは次のエラー メッセージで失敗します:

クラス コンストラクターは非同期メソッドである可能性があります

その理由は次のとおりです。基本: コンストラクター関数は、オブジェクト インスタンスを初期化して返す役割を果たします。ただし、async キーワードは関数を Promise ジェネレーターに変換するため、関数はオブジェクト自体ではなく Promise を返します。これにより、固有の矛盾が生じます。

不可能性を明らかにする

誤解は、async/await と Promise の間に認識されている類似性から生じます。 async/await は、Promise を操作するための糖衣構文を提供しますが、基礎となる動作は変更しません。 Promise は、解決または拒否して値を生成する非同期操作を表します。

対照的に、コンストラクター関数は構築中のオブジェクトを返す必要があります。この不変の要件は、非同期関数の Promise 生成動作と調和させることができません。

回避策

この制限を克服するには、次の設計パターンのいずれかの採用を検討してください。 :

  1. 初期化関数(init()): 非同期タスクを実行するための初期化関数を導入します。オブジェクト インスタンスは、この関数内でのみ使用できます。
var myObj = new myClass();
myObj.init(function() {
    // inside here you can use myObj
});
ログイン後にコピー
  1. ビルダー パターン: コンストラクターを直接呼び出す代わりに、ビルダー関数を使用してオブジェクトを作成します。実例。ビルダー関数は、すべての非同期タスクが完了すると、オブジェクト インスタンスに解決される Promise を返します。
myClass.build().then(function(myObj) {
    // myObj is returned by the promise, not by the constructor or builder
});

// with async/await:
async function foo () {
    var myObj = await myClass.build();
}
ログイン後にコピー

上記の例ではビルダー パターンで Promise を使用していますが、コールバックも使用できることに注意してください。

静的関数の考慮事項

重要です静的関数内の this キーワードは、インスタンス化されたオブジェクトを参照するのではなく、クラス自体を参照することに注意してください。したがって、静的関数内でメソッドを直接呼び出すことはできません。代わりに、クラス名を使用してメソッドを参照するか、静的メソッドとして宣言してください。

以上がJavaScript コンストラクターで Async/Await を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート