有人知道如何在angular do
方法返回的观察者上使用RxJS HttpClient.get
运算符吗?
版本:
使用此版本的角度我不能这样做:
import { HttpClient } from '@angular/common/http';
...
constructor(
private http: HttpClient,
) { }
...
this.http.get<Item>(url)
.do(res => console.log(JSON.stringify(res)))
.share();
相反,我必须用管道添加新步骤。我可以使用switchMap
,map
或share
执行此操作,但我无法弄清楚如何使用do
执行此操作。
我发现我可以import { _do } from 'rxjs/operator/do';
,但当我尝试使用它时:
this.http.get<Item>(url)
.pipe(_do(res => console.log(JSON.stringify(res)))
或者像这样:
const observable = this.http.get<Item>(url);
observable.pipe(_do(observable, res => console.log(JSON.stringify(res)}));
我收到错误:
[ts] The 'this' context of type 'void' is not assignable to method's 'this' of type 'Observable<{}>'.
答案 0 :(得分:1)
正如pipeable operators文档所述,可管道do
与其他几个人一起被重命名为tap
。这样做是为了避免与保留的JavaScript关键字冲突。
可管道运算符应该作为
导入import { tap } from 'rxjs/operators/tap';
请注意,可管道运算符位于rxjs/operators/...
,而rxjs/operator/...
导入用于修补Observable.prototype
。
没有任何担心会阻止do
运算符被用于某些Angular版本。两种导入样式都是受支持且有效的,只要开发人员了解补丁运算符和可管道运算符之间存在某些差异,这些差异使得后者在某些情况下更为可取。它们在documentation page上解释:
任何导入补丁运算符的库都会为该库的所有使用者扩充Observable.prototype,从而导致盲目 依赖。如果库删除了他们的用法,他们会在不知不觉中 打破其他人。使用pipeables,您必须导入运算符 你需要在你使用它们的每个文件中。
直接打印到原型上的操作员不会像rollup或webpack这样的工具“树木震动”。可管理的操作员 将是因为它们只是直接从模块中提取的功能。
任何类型的构建工具或lint规则都无法可靠地检测到在应用程序中导入的未使用的运算符。那 意味着你可以导入扫描,但是停止使用它,它仍然是 被添加到您的输出包。如果您有管道操作员,请使用 不使用它,一个棉绒规则可以为你挑选。
- 醇>
功能性成分非常棒。构建自己的自定义运算符变得更加容易,现在它们的工作和外观都很简单 像rxjs的所有其他运营商一样。你不需要扩展 可观察或超控升力。
答案 1 :(得分:0)
我在this answer的帮助下修复了它。
实际上,我输错了。此代码有效:
import 'rxjs/add/operator/do';
...
this.http.get<Item>(url)
.do(res => console.log(JSON.stringify(res))