等待observable完成

时间:2017-07-27 15:21:26

标签: javascript angular typescript rxjs observable

我有一系列依赖于其他方法完成的方法。

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#)

4 个答案:

答案 0 :(得分:5)

您可以尝试这样的事情......

main(data: string) : string {

    process1Data$: Observable<string> = process1(data)
        .take(1)
        .switchMap((process1Data) => return process2(process1Data);
    .
    .
    .
}

显然,take(1)假设proces1(...)解析为单值并停止。之后它switchMapprocess2,这意味着它开始发出process2给出的任何observable。 另一方面,如果您希望运行frmo process1发出的每个结果process2,则只需删除take(1)

答案 1 :(得分:2)

您可以使用rxjs concat运算符。 请参阅此处的文档 concat

基本上它等待直到第一个或源可观察的返回,然后执行下一个。

<强>更新

您还可以根据自己的要求尝试使用switch或switchmap等操作符。

答案 2 :(得分:1)

您可以使用es6 async / await

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

答案 3 :(得分:1)

原始问题中的

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);
   });
}