2017-07-27 103 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); 

    ... 

} 

如何在調用next方法(process2,process3)之前等待observable完成? (類似像等待在C#)

回答

3

你可以嘗試這樣的事情......

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)

1

您可以使用ES6異步/ AWAIT

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

是的,它會這樣工作,但我將不得不使所有主要的調用方法異步太。有沒有可能實現這一點,而不是主要的異步?如果需要,我可以讓process1異步。 – developer

2

您可以使用rxjs毗連運算。 請參閱此處的文檔。 concat

基本上它會等待直到第一個或源可觀察到的回報,然後執行下一個。

更新

您也可以根據您的要求嘗試像開關或switchmap運營商。