2016-03-27 4 views
3

リモートサービスに接続するES2015クラスがあります。ES2015では、すべてのメソッドがオブジェクトの初期化を待つようにする方法はありますか? ES7デコレータでは?

問題は、オブジェクトがリモートサーバーへの接続を終了する前に、自分のコードがこのクラスにアクセスしようとしていることです。

オブジェクトが初期化を完了していない場合にメソッドがエラーを出さないようにしたいと思います。

接続に依存しているクラスにはたくさんのメソッドがありますので、@ensureConnectedのようなすべてのメソッドに適用できる単一の理解しやすいメカニズムがあれば良いでしょう。デコレータ。ここ

フィドル:https://jsfiddle.net/mct6ss19/2/

'use strict'; 

class Server { 
    helloWorld() { 
     return "Hello world" 
    } 
} 

class Client { 
    constructor() { 
      this.connection = null 
      this.establishConnection() 
    } 

    establishConnection() { 
     // simulate slow connection setup by initializing after 2 seconds 
     setTimeout(() => {this.connection= new Server()}, 2000) 
    } 

    doSomethingRemote() { 
      console.log(this.connection.helloWorld()) 
    } 

} 

let test = new Client(); 
// doesn't work because we try immediately after object initialization 
test.doSomethingRemote(); 
// works because the object has had time to initialize 
setTimeout(() => {test.doSomethingRemote()}, 3000) 

私は接続が確立されるかどうかを確認するためのテストを実施することES7のデコレータを使用して画像化されたが、私はそうすることをどのように見ることができません。

+0

クライアントコンストラクタにコールバックパラメータを追加し、コールバック関数を渡し、サーバが応答した後にその関数を呼び出し、コールバックから他のクライアントメソッドを呼び出します。 –

+0

参考までに、デコレータはES7(ES2016)の一部ではありません。 –

+1

related:[コンストラクタ関数がPromiseを返すのは悪い習慣ですか?](http://stackoverflow.com/q/24398699/1048572) - 準備ができたらインスタンスを作成します。 – Bergi

答えて

3

私はコンストラクタで接続を開始しません。コンストラクタは、プログラムロジックではなく、変数などの初期化用に設計されています。代わりにお客様のクライアントコードからestablishConnectionとご連絡します。私を含むソリューションの範囲を試した末に

class Client { 
    constructor() { 
     this.connection = this.establishConnection(); 
    } 

    establishConnection() { 
     // simulate slow connection setup by initializing after 2 seconds 
     return new Promise(resolve => setTimeout(() => 
      resolve(new Server()), 2000)); 
    } 

    doSomethingRemote() { 
     this.connection.then(connection => connection.helloWorld()); 
    } 

} 
2

あなたはのように、コンストラクタでこれを行うインスタンス変数に結果を格納し、その後doSomethingRemoteにそれを待つしたい場合デコレータとプロキシオブジェクトの使用。

私が行った解決策は、ES7非同期を使用して待機することでした。それがどのように動作しているのかを理解しようとしていて、かなりうまくいきました。

asyncとawaitはオブジェクトが正しく初期化されたことを保証する最も効果的なソリューションでした。

@torazaburo(このページの彼の答えを参照)の助言を受けて、最初にオブジェクトを作成して初期化したファクトリから初期化メソッドを実行しました。

+0

コンストラクタで「待っていますか?どのようにして、コンストラクタは 'async'にならないという事実を回避しましたか? –

+0

@Duke Dougalはあなたの機能を詳しく説明してくれますか?本当に助けになるだろう! :) – mesqueeb

関連する問題