2017-07-27 4 views
2

私は、他の方法の完了に依存する一連の方法を持っています。観測が完了するまで待つ

process1(data: string) : Observable<string> { 
    this.dataservice.process(data).subscribe(
      (response) => { 
       return response.data; 
      } 
     ); 
} 

main(data: string) : string { 

    var process1Data: string = process1(data); 

    // I would like to wait for process1 method to complete before running process2 
    // I do not want to include process2 inside subscribe of process1 because I have to make few more method calls 
    var process2Data: string = process2(process1Data); 

    var process3Data: string = process3(process2Data); 

    ... 

} 

次のメソッド(process2、process3)を呼び出す前に、オブザーバブルが完了するのを待つ方法はありますか? (のような類似したが、C#で待つ)

答えて

3

...

main(data: string) : string { 

    process1Data$: Observable<string> = process1(data) 
     .take(1) 
     .switchMap((process1Data) => return process2(process1Data); 
    . 
    . 
    . 
} 

はもちろん、take(1)proces1(...)は、単一の値に解決して停止していることを前提としています。その後、switchMapからprocess2になります。つまり、process2から観測可能なものがあれば放射を開始します。 一方、process2がfrmo process1を発行した各結果の実行を希望する場合は、take(1)を削除してください。

1

あなたはrxjs、連結演算子を使用することができますES6非同期/のawait

async main(data: string): string { 
    var process1Data: string = await process1(data).toPromise(); 
    var process2Data: string = process2(process1Data); 
    ... 
} 
+0

はい、このように動作しますが、私はすべてのメインの呼び出しメソッドも非同期にする必要があります。メインの非同期化をせずにこれを実装することは可能ですか?必要に応じてprocess1を非同期にすることは大丈夫です。 – developer

2

を使用することができます。 こちらのドキュメントをご覧ください。 concat

基本的に、最初またはソースのオブザーバブルが戻ってから次に実行されるまで待機します。

更新

また、あなたの要件に応じて、スイッチまたはswitchmapのような演算子を試すことができます。

あなたはこのような何かを試してみてください
関連する問題