Angular 处理角度http调用并将结果传递给订户的正确方法

Angular 处理角度http调用并将结果传递给订户的正确方法,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我想在我的应用程序中使用服务发出请求。我希望按照通常的行为将订阅传递给调用者,但我也希望能够拦截结果,对其采取行动,但不改变它,然后继续 例如: return this.http.get<LicenseKeyAndUsageModel>('api/license') .map(data => { this.hasValidLicenseKeyInternal.next(!data.isExpired); return data;

我想在我的应用程序中使用服务发出请求。我希望按照通常的行为将订阅传递给调用者,但我也希望能够拦截结果,对其采取行动,但不改变它,然后继续

例如:

return this.http.get<LicenseKeyAndUsageModel>('api/license')
    .map(data => {
        this.hasValidLicenseKeyInternal.next(!data.isExpired);
        return data;
    })
    .catch((error: HttpErrorResponse) => {
        if (error.status === 404) {
            this.hasValidLicenseKeyInternal.next(false);
            return Observable.throw(new LicenseKeyMissingError());
        }
        else
            return Observable.throw(error);
    });
返回此.http.get('api/license')
.map(数据=>{
this.hasValidLicenseKeyInternal.next(!data.isExpired);
返回数据;
})
.catch((错误:HttpErrorResponse)=>{
如果(error.status==404){
this.hasValidLicenseKeyInternal.next(false);
返回可观察的.throw(new-LicenseKeyMissingError());
}
其他的
返回可观察抛出(错误);
});
因此,在本例中,我将检索当前许可证密钥,并更新服务级别值,以确定许可证密钥是否有效,同时仍将结果传递给原始订户

基本上,这似乎是正确的方法吗?或者我应该做一些更“可观察”的事情,比如多播或其他什么吗?

这就是
do()
操作符(或RxJS 5.5中的
tap()
)的意图

确实,您也可以使用
map()
进行此操作,但您需要记住始终返回原始值。另外,您想要的似乎是一种“副作用”(您想要执行影响可观察链之外的应用程序状态的操作),这就是
do()
的目的。

这就是
do()
操作符(或RxJS 5.5中的
tap()
的目的


确实,您也可以使用
map()
进行此操作,但您需要记住始终返回原始值。另外,您想要的似乎是一种“副作用”(您想要执行影响可观察链之外的应用程序状态的操作),这就是
do()
的目的。

Rxjs
tap
就是您想要的

查看更多信息


很抱歉,没有在手机上发布一个大的答案。

Rxjs
tap
是您想要的

查看更多信息


很抱歉没有在手机上发布一个大的答案。

我想这是你想要的,而不是
地图。
:。我想这是你想要的,而不是
地图。
:。guess@martin已经回答了。无论如何,如果这个链接有用的话,guess@martin已经回答了。无论如何,如果这个链接有用的话