我有一个函数可以访问两个Observable并返回一个Observable。
首先订阅了第一个Observable。根据它的答案,必须订阅第二个Observable(也将第一个Observable的值传递给它)或不。但无论如何应该从函数返回一个Observable。如果条件确定必须查询第二个Observable,那么返回的Observable当然应该只在第二个Observable完成后才完成。在另一种情况下,返回的Observable在第一个Observable完成时完成。
到目前为止,我已经得到了这个:
private load(): Observable<boolean> {
return this.accessControl.map((res: any) => {
if (res.accessGranted) {
this.dataService.getData(res.id).subscribe((v: number) => {
this.value = v;
}, () => {
this.value = null;
this.showErrorMessage();
});
} else {
this.value = null;
}
return true;
})
.first();
}
返回的Observable是第一个的映射版本。但是,到目前为止,我还没有等到第二个Observable,并在if子句的计算结果为true时返回它的映射版本。
更新
根据LLai的回答,我现在想出了这个:
private load(): Observable<boolean> {
return this.accessControl.flatMap((res: any) => {
if (res.accessGranted) {
return this.dataService.getData(res.id)
.catch((err) => {
this.value = null;
this.showErrorMessage();
return Observable.throw(err);
})
.map((v: number) => {
this.value = v;
return true;
});
} else {
this.value = null;
return Observable.of(null);
}
})
.first();
}
答案 0 :(得分:3)
你想要flatMap函数http://reactivex.io/documentation/operators/flatmap.html
private load(): Observable<boolean> {
return this.accessControl.flatMap((res: any) => {
if (res.accessGranted) {
return this.dataService.getData(res.id);
} else {
return Observable.of(null);
}
})
然后订阅这个可观察的序列。这将链接api调用。这是flatMap https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs
上的一个很好的资源