簡體   English   中英

等待可觀察完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM