将Angular2 Http响应转换为ConnectableObservable

时间:2016-01-08 13:11:31

标签: angular observable rxjs

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

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

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

至少我的IDE接缝同意这一点,并没有显示任何警告。然而,运行代码会出现以下错误:

  

异常:评估“点击”时出错   原始异常:TypeError:obs.publish不是函数

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

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

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

1 个答案:

答案 0 :(得分:6)

事实上,我认为使用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'));

修改

我认为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'));

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

这个问题对您有所帮助:Hot and shared Observable from an EventEmitter

<强> EDIT1

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

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

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

import 'rxjs/add/operator/map'

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

import 'rxjs/Rx';

希望它可以帮到你, 亨利