我有一系列依赖于其他方法完成的方法。
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#)
答案 0 :(得分:5)
您可以尝试这样的事情......
main(data: string) : string {
process1Data$: Observable<string> = process1(data)
.take(1)
.switchMap((process1Data) => return process2(process1Data);
.
.
.
}
显然,take(1)
假设proces1(...)
解析为单值并停止。之后它switchMap
到process2
,这意味着它开始发出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);
});
}