88

ES6 クラスは、組織のパターンとして、非同期コードに何を提供できますか。以下は ES7 async/await の例です。ES6 クラスは非同期メソッドまたは ES7 のコンストラクターを持つことができますか?

僕にできる:

class Foo {
    async constructor() {
        let res = await getHTML();
        this.res = res
    }
}

そうでない場合、これを行うコンストラクターはどのように機能する必要がありますか?

class Foo {
    constructor() {
        getHTML().then( function (res) {
            this.res = res
        }
    }
}

これらのパターンのどちらも機能しない場合、ES6 のコンストラクター (およびさらにクラス) はclass、オブジェクトの状態で動作する任意の形式の非同期性をサポートできますか? それとも、純粋な同期コード ベースのみを対象としているのでしょうか? 上記の例はコンストラクターにありますが、そうである必要はありません.. 問題をもう 1 レベル下にプッシュします..

class Foo {
    myMethod () {
      /* Can I do anything async here */
    }
}

または、ゲッターで...

class Foo {
    get myProp() {
        /* Is there any case that this is usefully asynchronous */
    }
}

私が考えることができる唯一の例は、同じメソッド/コンストラクター/ゲッター内で何かを並行して実行することですが、結論の前にすべてを解決することです。完全に非同期のライブラリへのすべてのプッシュがあるように見えるので、私は混乱しています。これは物事を混乱させるのに役立ちます. 教科書の例を除いて、それらが役立つアプリケーションは 1 つも見つかりません。

4

5 に答える 5

68

僕にできるasync constructor()

いいえ、それは構文エラーconstructor* ()です。コンストラクターは、何も返さない (promise もジェネレーターもない) メソッドであり、インスタンスを初期化するだけです。

そして、そうでない場合、これを行うコンストラクターはどのように機能する必要がありますか

そのようなコンストラクターはまったく存在すべきではありません。コンストラクター関数が Promise を返すのは悪い習慣ですか? を参照してください。

ES6 クラスは、オブジェクトの状態で動作する任意の形式の非同期をサポートできますか? それとも、純粋な同期コード ベースのみを対象としているのでしょうか?

はい、クラスで非同期メソッドを (提案されたasync構文を使用しても) 使用でき、ゲッターは promise を返すこともできます。

ただし、非同期プロセスがまだアクティブなときにメソッドが呼び出された場合にどうするかを決定する必要があります。すべての操作をシーケンス化する場合は、インスタンスの状態を、連鎖可能なシーケンスの最後にプロミス内に保存する必要があります。または、並列操作を許可する場合は、インスタンスを不変にして、別のインスタンスの promise を返すことをお勧めします。

于 2016-05-31T22:11:43.350 に答える
29

クラスが非同期タスクの配置に役立つもう 1 つの方法は、静的メソッドのみを使用することです。

class Organizer {
    static async foo() {
        const data = await this.bar();
        data.key = value;
        return data;
    }
    static async bar() {
        return {foo:1, bar:2}
    }
};

Organizer.foo();

もちろん、これは単純なオブジェクト リテラルまたは新しいファイルを作成してそれをインクルードすることと何ら変わりはありませんが、よりきれいにすることができますextend

于 2016-05-31T23:59:54.787 に答える