我想在我的应用程序中使用服务发出请求。我希望将订阅传递给调用者,这是通常的行为,但我希望能够拦截结果,对其采取行动但不改变它,并继续。
例如:
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()
,但你需要记住总是返回原始值。你想要的似乎也是一个“副作用”(你想要执行影响可观察链之外的应用程序状态的动作),这就是do()
的用途。