2017-07-27 85 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运营商。