将Angular2 Http响应转换为ConnectableObservable

jar*_*bjo 2 observable rxjs angular

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

我的目的是发出HTTP请求(到REST服务)并允许将响应发送给返回的observable的多个订阅者.如果我正确理解文档,我可以使用publish()函数将例如http.post函数返回的Observable转换为ConnectableObservable,通过多次调用ConnectableObservable.subcribe(...)来注册多个subsriber,然后调用ConnectableObservable .connect()实际执行HTTP请求,例如:

var obs: Observable<Response> = this.http.post(...);
var cobs: ConnectableObservable<Response> = obs.publish();
cobs.subscribe(sub1);
cobs.subscribe(sub2);
cobs.connect();
Run Code Online (Sandbox Code Playgroud)

至少我的IDE接缝同意这一点,并没有显示任何警告.运行代码,但我得到以下错误:

EXCEPTION:评估"click"时出错
ORIGINAL EXCEPTION:TypeError:obs.publish不是函数

如果我obs在调试器中检查对象,则实际上只有一小部分记录的函数可用.如果我查看Observable类的实现,确实只实现了一些记录的函数.大多数函数(其中包括publish函数)仅在没有任何实际实现的情况下声明为函数签名.

我在这里做了一些明显错误的事情,还是我完全误解了如何使用RxJS observables?

如果重要的话,我正在构建gulp,使用npm来解析和下载依赖项,并在我的node_modules目录中包含rxjs/bundles/Rx.js.

Thi*_*ier 6

事实上,我认为使用a ConnectableObservable是没有必要的.这是我做的测试,并在收到响应时调用两个订阅者:

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'));
Run Code Online (Sandbox Code Playgroud)

编辑

我认为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'));
Run Code Online (Sandbox Code Playgroud)

它允许创建一个可连接的observable(该share方法返回一个hot observable).在这种情况下,只执行一个HTTP请求...

这个问题可能对您有所帮助:来自EventEmitter的热门和共享Observable.

EDIT1

在评论中进行了一些讨论后,似乎问题是关于为什么发生以下错误:TypeError: obs.share is not a function为什么几乎所有记录的函数在post函数返回的observable中都不可用.

所以解决方案是显式导入RxJS运算符以使它们在运行时可用.

有两种解决方案.每个运营商导入:

import 'rxjs/add/operator/map'
Run Code Online (Sandbox Code Playgroud)

或者更常见的是,如果您想要为可观察对象提供所有可用的运算符方法:

import 'rxjs/Rx';
Run Code Online (Sandbox Code Playgroud)

希望它对你有帮助,蒂埃里