rxjs根据第一个答案返回不同的Observable

时间:2017-06-20 22:33:57

标签: angular rxjs observable reactive-programming

我有一个函数可以访问两个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();
}

1 个答案:

答案 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

上的一个很好的资源