使用 angular http 调用并将结果传递给订阅者的正确方法
Correct way to work with angular http calls and pass results to subscriber
我想通过我的应用程序中的服务发出请求。我想像往常一样将订阅传递给调用者,但我也希望能够拦截结果,对其进行操作但不更改它,然后继续。
例如:
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);
});
所以在这种情况下,我正在检索当前的许可证密钥,并更新关于许可证密钥是否有效的服务级别值,并将结果传递给原始订阅者。
基本上这看起来是正确的方法吗?或者我应该做更多的事情 'Observable-y' 比如多播或其他什么?
这就是 do()
运算符(或 RxJS 5.5 中的 tap()
)的目的。
的确,您也可以为此使用 map()
,但您需要记住始终 return 原始值。此外,您想要的似乎是 "side-effect"(您想执行影响可观察链之外的应用程序状态的操作),这就是 do()
的目的。
Rxjs tap
就是你想要的。
查看this
更多信息。
很抱歉没有发布一个访问彻底移动的大答案。
我想通过我的应用程序中的服务发出请求。我想像往常一样将订阅传递给调用者,但我也希望能够拦截结果,对其进行操作但不更改它,然后继续。
例如:
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);
});
所以在这种情况下,我正在检索当前的许可证密钥,并更新关于许可证密钥是否有效的服务级别值,并将结果传递给原始订阅者。
基本上这看起来是正确的方法吗?或者我应该做更多的事情 'Observable-y' 比如多播或其他什么?
这就是 do()
运算符(或 RxJS 5.5 中的 tap()
)的目的。
的确,您也可以为此使用 map()
,但您需要记住始终 return 原始值。此外,您想要的似乎是 "side-effect"(您想执行影响可观察链之外的应用程序状态的操作),这就是 do()
的目的。
Rxjs tap
就是你想要的。
查看this
更多信息。
很抱歉没有发布一个访问彻底移动的大答案。