将Angular2 Http响应转换为ConnectableObservable

将Angular2 Http响应转换为ConnectableObservable,angular,observable,rxjs,Angular,Observable,Rxjs,我必须承认,我正在对Angular2做我的第一步,我在这里遇到了一个问题,我在理解上有一些问题。我正在使用angular2@2.0.0-beta.0,它依赖于rxjs@5.0.0-beta.0 我的意图是发出一个HTTP请求(到REST服务),并允许将响应发送到返回的observable的多个订户。如果我正确理解了文档,我可以使用publish()函数将http.post函数返回的Observable转换为ConnectableObservable,通过多次调用ConnectableObserv

我必须承认,我正在对Angular2做我的第一步,我在这里遇到了一个问题,我在理解上有一些问题。我正在使用angular2@2.0.0-beta.0,它依赖于rxjs@5.0.0-beta.0

我的意图是发出一个HTTP请求(到REST服务),并允许将响应发送到返回的observable的多个订户。如果我正确理解了文档,我可以使用publish()函数将http.post函数返回的Observable转换为ConnectableObservable,通过多次调用ConnectableObservable.subcribe(…)注册多个subscriber,然后调用ConnectableObservable.connect()实际执行http请求,例如,像这样:

var obs: Observable<Response> = this.http.post(...);
var cobs: ConnectableObservable<Response> = obs.publish();
cobs.subscribe(sub1);
cobs.subscribe(sub2);
cobs.connect();
var obs:Observable=this.http.post(…);
var cobs:ConnectableObservable=obs.publish();
cobs.认购(第1款);
cobs.认购(sub2);
cobs.connect();
至少我的IDE seam同意这一点,并且没有显示任何警告。但是,在运行代码时,我确实会遇到以下错误:

异常:在“单击”的评估过程中出错
原始异常:TypeError:obs.publish不是一个函数

如果我在调试器中检查
obs
对象,实际上只有一小部分对象可用。如果我查看这个类,实际上只实现了一些文档化的函数。大多数函数(其中包括
publish
函数)仅声明为函数签名,没有任何实际实现

我是否在这里做了一些明显错误的事情,或者我是否完全误解了如何使用RxJS观测值


如果有关系的话,我正在使用gulp构建,使用npm来解析和下载依赖项,并从我的node_modules目录中包括rxjs/bundles/Rx.js。

事实上,我认为使用
可连接的可观察的
是没有必要的。以下是我所做的测试,当收到响应时,将调用两个订户:

var observable =
  this.http.get('https://angular2.apispark.net/v1/companies/')
           .map(res => res.json());

observable.subscribe(
  data => console.log('subscribe #1'));
observable.subscribe(
  data => console.log('subscribe #2'));
编辑

我认为
share
运营商可以满足您的需求:

var observable =
  this.http.get('https://angular2.apispark.net/v1/companies/')
           .map(res => res.json()).share();

observable.subscribe(
  data => console.log('subscribe #1'));
observable.subscribe(
  data => console.log('subscribe #2'));
它允许创建一个可连接的可观察对象(
share
方法返回一个热可观察对象)。在这种情况下,只执行一个HTTP请求

此问题可能对您有所帮助:

Edit1

在评论中进行了一些讨论之后,问题似乎是为什么会出现以下错误:
TypeError:obs.share不是一个函数
,为什么post函数返回的observable中几乎所有记录的函数都不可用

因此,解决方案是显式导入RxJS操作符,使其在运行时可用

有两种解决办法。按操作员导入:

import 'rxjs/add/operator/map'
或者更一般地说,如果您想拥有所有可观测的运算符方法:

import 'rxjs/Rx';
希望它能帮助你,
Thierry

这是我的第一次尝试,但如果您看到与我相同的行为,使用该代码,实际的HTTP请求将执行两次-每个订户一次。这不是我想要的。
share
操作符似乎就是您要找的;-)使用它只执行一个HTTP请求…我不确定
share
操作符是否严格符合我的要求,但共享函数也没有实现:“TypeError:obs.share不是函数”我的问题也是“为什么post函数返回的observable中几乎所有记录的函数都不可用?”真的吗。我没有你的错误(“TypeError:obs.share不是函数”)。。。我的所有观察者都收到了数据。我对共享功能的理解是,从文档中我不清楚HTTP请求何时实际执行。最有可能的情况是,HTTP请求在注册第一个订户时启动。如果在HTTP请求完成后添加了后续订阅服务器,则文档中不清楚是否调用了这些订阅服务器。但我要重复一次:我的问题并不是关于发布和共享之间的详细区别,而是为什么运行时对象中几乎所有可观察的函数都丢失了。