我必须承认我正在使用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。
答案 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';
希望它可以帮到你, 亨利