将 Angular2 Http 响应转换为 ConnectableObservable
Converting Angular2 Http response to ConnectableObservable
我必须承认,我正在使用 Angular2 迈出第一步,我 运行 遇到了一个问题,我对它的理解有一些问题。我正在使用 angular2@2.0.0-beta.0,它依赖于 rxjs@5.0.0-beta.0。
我的意图是发出 HTTP 请求(向 REST 服务)并允许将响应发送给返回的可观察对象的多个订阅者。如果我正确理解了文档,我可以使用 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 同意这一点并且没有显示任何警告。 运行 代码,但是我收到以下错误:
EXCEPTION: Error during evaluation of "click"
ORIGINAL EXCEPTION: TypeError: obs.publish is not a function
如果我在调试器中检查 obs
对象,只有 documented functions are actually available. If I look into the implementation of the Observable class 的一个非常小的子集,确实只实现了几个记录的函数。大多数函数,其中 publish
函数,仅声明为函数签名,没有任何实际实现。
我是不是做错了什么,或者我完全误解了如何使用 RxJS observables?
如果重要的话,我正在使用 gulp 进行构建,使用 npm 解析和下载依赖项,并从我的 node_modules 目录中包含 rxjs/bundles/Rx.js。
事实上,我认为没有必要使用 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'));
它允许创建一个可连接的可观察对象(share
方法 returns 一个热可观察对象)。在这种情况下,只执行一个 HTTP 请求...
这个问题可能对您有帮助:。
编辑1
在评论中进行一些讨论后,问题似乎是关于为什么会出现以下错误:TypeError: obs.share is not a function
以及为什么 [=45= 返回的可观察对象中几乎所有记录的函数都不可用] 函数。
所以解决方案是显式导入 RxJS 运算符,使它们在运行时可用。
有两种解决方法。每个操作员导入:
import 'rxjs/add/operator/map'
或者更一般地说,如果您想拥有可观察对象的所有可用运算符方法:
import 'rxjs/Rx';
希望对你有帮助,
蒂埃里
我必须承认,我正在使用 Angular2 迈出第一步,我 运行 遇到了一个问题,我对它的理解有一些问题。我正在使用 angular2@2.0.0-beta.0,它依赖于 rxjs@5.0.0-beta.0。
我的意图是发出 HTTP 请求(向 REST 服务)并允许将响应发送给返回的可观察对象的多个订阅者。如果我正确理解了文档,我可以使用 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 同意这一点并且没有显示任何警告。 运行 代码,但是我收到以下错误:
EXCEPTION: Error during evaluation of "click"
ORIGINAL EXCEPTION: TypeError: obs.publish is not a function
如果我在调试器中检查 obs
对象,只有 documented functions are actually available. If I look into the implementation of the Observable class 的一个非常小的子集,确实只实现了几个记录的函数。大多数函数,其中 publish
函数,仅声明为函数签名,没有任何实际实现。
我是不是做错了什么,或者我完全误解了如何使用 RxJS observables?
如果重要的话,我正在使用 gulp 进行构建,使用 npm 解析和下载依赖项,并从我的 node_modules 目录中包含 rxjs/bundles/Rx.js。
事实上,我认为没有必要使用 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'));
它允许创建一个可连接的可观察对象(share
方法 returns 一个热可观察对象)。在这种情况下,只执行一个 HTTP 请求...
这个问题可能对您有帮助:
编辑1
在评论中进行一些讨论后,问题似乎是关于为什么会出现以下错误:TypeError: obs.share is not a function
以及为什么 [=45= 返回的可观察对象中几乎所有记录的函数都不可用] 函数。
所以解决方案是显式导入 RxJS 运算符,使它们在运行时可用。
有两种解决方法。每个操作员导入:
import 'rxjs/add/operator/map'
或者更一般地说,如果您想拥有可观察对象的所有可用运算符方法:
import 'rxjs/Rx';
希望对你有帮助, 蒂埃里