コンストラクター内の非同期呼び出し:不可能な努力
customelements.define( 'e-mail'、class extends htmlelement { async constructor(){ 素晴らしい() let uid = this.getattribute( 'data-uid') メッセージ= grabuid(uid)を待ってください const Shadowroot = this.attachshadow({mode: 'open'}) Shadowroot.innerhtml = `
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 = `残念ながら、このコードはエラーメッセージで失敗します:クラスコンストラクターは非同期メソッドではない場合があります
この理由は基本です:コンストラクター関数は、オブジェクトインスタンスの初期化と返却に関与します。ただし、Asyncキーワードは関数をPromise Generatorに変換し、その結果、機能がオブジェクト自体の代わりに約束を返すようになります。これにより、固有の競合が作成されます。 Async/Awaitは、約束を扱うために構文砂糖を提供しますが、根本的な行動を変えることはありません。約束は、値を生成するために解決または拒否する非同期操作を表します。この不変の要件は、非同期関数の約束を生成する動作と調整することはできません。非同期タスクを実行する初期化関数。オブジェクトインスタンスは、この関数内でのみ使用できます。 myobj.init(function(){ //ここにはMYOBJを使用できます });
ビルダーパターン:コンストラクターを直接呼び出す代わりに、ビルダー関数を使用してオブジェクトインスタンスを作成します。ビルダー関数は、すべての非同期タスクが完了したらオブジェクトインスタンスに解決する約束を返します。 // MYOBJは、コンストラクターやビルダーによってではなく、約束によって返されます }); // async/await: async関数foo(){ var myobj = await myclass.build(); }
上記の例はビルダーパターンで約束を使用しているが、コールバックも使用できることに注意してください。したがって、静的関数内でメソッドを直接呼び出すことはできません。代わりに、クラス名を使用したメソッドを参照するか、静的メソッドとして宣言します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3