他のメソッドの完了に依存する一連のメソッドがあります。
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#でawaitと同様)
あなたはこのようなものを試すかもしれません...
_main(data: string) : string {
process1Data$: Observable<string> = process1(data)
.take(1)
.switchMap((process1Data) => return process2(process1Data);
.
.
.
}
_
明らかに、take(1)
は、proces1(...)
が単一の値に解決されて停止すると想定しています。その後、switchMap
sを_process2
_に変換します。これは、process2から取得できる監視対象をすべて出力し始めることを意味します。一方、_process2
_がfrmo process1によって発行された各結果に対して実行されるようにするには、take(1)
を削除します。
Rxjs concat演算子を使用できます。こちらのドキュメントをご覧ください。 連結
基本的に、最初またはソースオブザーバブルが戻るまで待機してから、次に実行します。
更新
要件に応じて、switchやswitchmapなどの演算子を試すこともできます。
Es6 async/awaitを使用できます
async main(data: string): string {
var process1Data: string = await process1(data).toPromise();
var process2Data: string = process2(process1Data);
...
}
process1
が返されないため、元の質問のObservable<string>
は混乱します( 'rxjs/Observable'の別のObservable
を使用している可能性があります)。
これは私が(元の質問で)参照しているコードです:
process1(data: string) : Observable<string> {
this.dataservice.process(data).subscribe(
(response) => {
return response.data;
}
);
}
私にとっては、これを次のように変更しました:
process1(data: string) : Observable<string> {
return this.dataservice.process(data).map( //subscribe-->map
(response) => {
return response.data;
}
);
}
次に、process1
の完了後に何かを実行するには、他のsubscribe
と同じようにObservable
を使用します。
main(data: string) : string {
process1(data).subscribe((process1RetVal)=>
{
process2(process1RetVal);
});
}