我必须承认我正在使用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= this.http.post(...); var cobs: ConnectableObservable = obs.publish(); cobs.subscribe(sub1); cobs.subscribe(sub2); cobs.connect();
至少我的IDE接缝同意这一点,并没有显示任何警告.运行代码,但我得到以下错误:
EXCEPTION:评估"click"时出错
ORIGINAL EXCEPTION:TypeError:obs.publish不是函数
如果我obs
在调试器中检查对象,则实际上只有一小部分记录的函数可用.如果我查看Observable类的实现,确实只实现了一些记录的函数.大多数函数(其中包括publish
函数)仅在没有任何实际实现的情况下声明为函数签名.
我在这里做了一些明显错误的事情,还是我完全误解了如何使用RxJS observables?
如果重要的话,我正在构建gulp,使用npm来解析和下载依赖项,并在我的node_modules目录中包含rxjs/bundles/Rx.js.
事实上,我认为使用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'));
编辑
我认为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请求...
这个问题可能对您有所帮助:来自EventEmitter的热门和共享Observable.
EDIT1
在评论中进行了一些讨论后,似乎问题是关于为什么发生以下错误:TypeError: obs.share is not a function
为什么几乎所有记录的函数在post函数返回的observable中都不可用.
所以解决方案是显式导入RxJS运算符以使它们在运行时可用.
有两种解决方案.每个运营商导入:
import 'rxjs/add/operator/map'
或者更常见的是,如果您想要为可观察对象提供所有可用的运算符方法:
import 'rxjs/Rx';
希望它对你有帮助,蒂埃里