Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对HttpClient.get返回的可观察对象实现副作用?_Javascript_Angular_Angular5_Observers - Fatal编程技术网

Javascript 如何对HttpClient.get返回的可观察对象实现副作用?

Javascript 如何对HttpClient.get返回的可观察对象实现副作用?,javascript,angular,angular5,observers,Javascript,Angular,Angular5,Observers,有人知道如何在angular的HttpClient.get方法返回的观测者上使用RxJSdo运算符吗 版本: 角度:5.2.1 rxjs:5.5.6 使用此版本的angular,我无法做到这一点: 从'@angular/common/http'导入{HttpClient}; ... 建造师( 私有http:HttpClient, ) { } ... this.http.get(url) .do(res=>console.log(JSON.stringify(res))) .share();

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

版本:

  • 角度:5.2.1
  • rxjs:5.5.6
使用此版本的angular,我无法做到这一点:

从'@angular/common/http'导入{HttpClient};
...
建造师(
私有http:HttpClient,
) { }
...
this.http.get(url)
.do(res=>console.log(JSON.stringify(res)))
.share();
相反,我必须添加带有管道的新步骤。我可以用
switchMap
map
share
来做,但我不知道如何用
do
来做

我发现我可以从'rxjs/operator/do'导入{{u do},但当我尝试这样使用它时:

this.http.get(url)
.pipe(_do(res=>console.log(JSON.stringify(res)))
或者像这样:

const observable=this.http.get(url);
pipe(_do(observable,res=>console.log(JSON.stringify(res)}));
我得到一个错误:

[ts]类型为“void”的“this”上下文不可分配给类型为“Observable”的方法的“this”。
我在的帮助下修复了它

实际上,我的导入错误。此代码有效:

导入'rxjs/add/operator/do';
...
this.http.get(url)
.do(res=>console.log(JSON.stringify(res))
如文档所述,pipeable
do
与其他几个关键字一起被重命名为
tap
。这样做是为了避免与保留的JavaScript关键字发生冲突

管道式操作器应作为

import { tap } from 'rxjs/operators/tap';
请注意,可管道操作符位于
rxjs/operators/…
中,而
rxjs/operator/…
导入用于修补
可观察的.prototype

在某些角度版本中,没有任何问题会阻止使用
do
操作符。只要开发人员了解修补操作符和可管道操作符之间存在某些差异,使得后者在某些情况下更可取,这两种导入样式都是受支持和有效的。下面将对它们进行说明:

  • 任何导入补丁操作符的库都将为该库的所有使用者增加Observable.prototype,从而创建盲 依赖项。如果库删除了它们的用法,它们会在不知不觉中被删除 打断其他人。使用管道,您必须导入操作符 您需要将它们输入到每个使用它们的文件中

  • 直接打补丁到原型上的操作符不能通过rollup或webpack等工具“摇动树” 因为它们只是直接从模块中拉入的函数

  • 任何类型的构建工具或lint规则都无法可靠地检测应用程序中导入的未使用的运算符 这意味着您可能会导入扫描,但停止使用它,它仍然是 正在添加到输出包。如果您 不用它,皮棉尺可以帮你捡起来

  • 功能组合非常棒。构建自己的自定义操作符变得越来越容易,现在它们可以正常工作,看起来也很简单 与rxjs中的所有其他操作符一样,您不需要扩展 可观察到或超越升力


  • do
    被替换为。在上面找到任何真正好的文档似乎是一项任务。可能会很有用。@R.Richards感谢您的评论和链接。幸运的是,我已经解决了这个问题。但我很好奇,为什么会有这个
    do
    函数?我毫不怀疑这是为了向后兼容。管道的优点是显而易见的我在文档中添加了d。这是一个品味问题。只要你不发布库并理解它们之间的区别,老式的操作符就可以了。