如何实现HttpClient.get重新调整的Observable的副作用?

时间:2018-01-20 21:47:13

标签: javascript angular angular5 observers

有人知道如何在angular do方法返回的观察者上使用RxJS HttpClient.get运算符吗?

版本:

  • angular:5.2.1
  • rxjs:5.5.6

使用此版本的角度我不能这样做:

import { HttpClient } from '@angular/common/http';

...

constructor(
  private http: HttpClient,
) { }

...

this.http.get<Item>(url)
  .do(res => console.log(JSON.stringify(res)))
  .share();

相反,我必须用管道添加新步骤。我可以使用switchMapmapshare执行此操作,但我无法弄清楚如何使用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<{}>'.

2 个答案:

答案 0 :(得分:1)

正如pipeable operators文档所述,可管道do与其他几个人一起被重命名为tap。这样做是为了避免与保留的JavaScript关键字冲突。

可管道运算符应该作为

导入
import { tap } from 'rxjs/operators/tap';

请注意,可管道运算符位于rxjs/operators/...,而rxjs/operator/...导入用于修补Observable.prototype

没有任何担心会阻止do运算符被用于某些Angular版本。两种导入样式都是受支持且有效的,只要开发人员了解补丁运算符和可管道运算符之间存在某些差异,这些差异使得后者在某些情况下更为可取。它们在documentation page上解释:

  
      
  1. 任何导入补丁运算符的库都会为该库的所有使用者扩充Observable.prototype,从而导致盲目   依赖。如果库删除了他们的用法,他们会在不知不觉中   打破其他人。使用pipeables,您必须导入运算符   你需要在你使用它们的每个文件中。

  2.   
  3. 直接打印到原型上的操作员不会像rollup或webpack这样的工具“树木震动”。可管理的操作员   将是因为它们只是直接从模块中提取的功能。

  4.   
  5. 任何类型的构建工具或lint规则都无法可靠地检测到在应用程序中导入的未使用的运算符。那   意味着你可以导入扫描,但是停止使用它,它仍然是   被添加到您的输出包。如果您有管道操作员,请使用   不使用它,一个棉绒规则可以为你挑选。

  6.   
  7. 功能性成分非常棒。构建自己的自定义运算符变得更加容易,现在它们的工作和外观都很简单   像rxjs的所有其他运营商一样。你不需要扩展   可观察或超控升力。

  8.   

答案 1 :(得分:0)

我在this answer的帮助下修复了它。

实际上,我输错了。此代码有效:

import 'rxjs/add/operator/do';

...

this.http.get<Item>(url)
  .do(res => console.log(JSON.stringify(res))