[英]Wait for observable to complete
我有一系列方法,這些方法依賴於其他方法的完成。
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)
假設process1(...)
解析為單個值並停止。 之后它將switchMap
s 切換到process2
,這意味着它開始發射process2
給出的任何可觀察到的東西。 另一方面,如果您希望process2
運行從process1
發出的每個結果,那么只需刪除take(1)
。
您可以使用 rxjs concat 運算符。 請參閱此處的文檔。 連接
基本上它會等到第一個或源 observable 返回,然后執行下一個。
更新
您也可以根據自己的要求嘗試 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
完成后發生一些事情,只需像使用任何其他Observable
一樣使用subscribe
:
main(data: string) : string {
process1(data).subscribe((process1RetVal)=>
{
process2(process1RetVal);
});
}
您需要的是 concatMap 運算符。
通過 concatMap 運算符發出的每個項目將被一個一個地執行。 您可以利用它來實現您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.