web-dev-qa-db-ja.com

オブザーバブルが終了するのを待っています

オブザーバブルが完了するのを待つ必要があるメソッドがあります。オブザーバブルは時間の経過とともに単一のデータを返すのに最適ですが、返されたオブジェクトに対して検証コードを実行できるように、このオブザーバブルがすべてのデータを完全に返し終えたときを知る必要があります。

メソッドgetCustomは、指定されたURLでの監視可能な実行をサブスクライブし、監視可能な結果を​​返します。

これがこの状況に対処するための最良の方法であるかどうかあまりわかりませんので、誰かが私にこれを処理するためのアドバイスや指示をいただければ幸いです。

  private validateQuoteRetrievalAnswers(reference: string) {

         // Get the risk from the server
        this.riskManager.getRiskFromServer(reference);

        if (this.riskManager.risk) {
            // Validate risk that was returned
        }
    }
getRiskFromServer(quoteReference: string) {

    this.riskService.getCustom("Url").subscribe => {
        // need to know when the observable has returned the risk
    });

}
7
user4129529

この課題への取り組み方:

バックエンドにクエリを実行し、必要なものが得られたら、それをサブジェクトにプッシュします。

riskSubject = new Subject<Risk>();

getRiskFromServer(quoteReference: string) {
  this.riskService.getCustom("Url")
  .subscribe( 
    data => { this.riskSubject.next(data); },
    error => { console.log(error) }
 });
}

次に、サブジェクトをサブスクライブし、必要なものを取得して検証を開始するまで待ちます

private validateQuoteRetrievalAnswers(reference: string) {

         // Get the risk from the server
        this.riskManager.getRiskFromServer(reference);
        // subscribe to subject
        this.riskManager.riskSubject.subscribe(
         data => {
           //do your validation
        })
}

監視可能なデータサービスの中心はRxJサブジェクトです。サブジェクトはObserverとObservableの両方のインターフェースを実装します。つまり、これらを使用して値を出力し、サブスクリプトを登録できます。

サブジェクトは従来のイベントバスにすぎませんが、すべてのRxJ機能オペレーターに提供されるため、はるかに強力です。ただし、基本的には、通常のオブザーバブルと同じように、それを使用してサブスクライブします。

ソース: angular-university.io

または、Observable.fromPromise(promise)を使用することもできますが、これにより、ng2を初めて使用する場合に理解が少し複雑になります。

4
VikingCode