【发布时间】:2016-03-05 05:58:13
【问题描述】:
有没有办法从 EventEmitter (或 Angular 2 alpha 46 / RxJS 5 alpha 中提供的等效项)获得一个热可观察对象?即如果我们在解析值后订阅,它会触发之前解析的值。类似于我们总是返回相同的承诺。
理想情况下,仅使用 Angular 2 对象(我在某处读到稍后会嵌入轻量级 RxJS 以消除依赖关系),否则导入 RxJS 就可以了。 AsyncSubject 似乎符合我的需要,但它在 RxJS 5 alpha 中不可用。
我尝试了以下操作,但没有成功(从不触发)。知道如何使用它吗?
let emitter = new EventEmitter<MyObj>();
setTimeout(() => {emitter.next(new MyObj());});
this.observable = emitter;
return this.observable.share();
Full plunker here comparing hot and cold
用例:仅访问某些异步对象一次(例如,一系列 HTTP 调用合并/包装在 new EventEmitter 中),但提供已解析的异步对象订阅它的任何服务/组件,即使它们在解决后订阅(收到 HTTP 响应)。
编辑:问题不在于如何合并 HTTP 响应,而是如何从 EventEmitter 或任何可用于 Angular 2 alpha 46 / RxJS 5 alpha 的等价物获得(热?)可观察的,允许在检索/解析异步结果(HTTP 只是异步源的一个示例)。 myEventEmitter.share() 不起作用(参见上面的 plunker),尽管它适用于 HTTP 返回的 Observable(参见 plunker from@Eric Martinez)。从 Angular 2 alpha 46 开始,.toRx() 方法不再存在,EventEmitter 是可观察对象和主体本身。
只要我们总是返回相同的 Promise 对象,这与 Promise 配合得很好。由于我们在 HTTP Angular 2 服务中引入了观察者,因此我想避免混淆承诺和观察者(据说观察者比承诺更强大,所以它应该允许用承诺做容易的事情)。
Specs about share()(我还没有找到版本 5 alpha 的文档 - Angular 2 使用的版本) - 处理 Angular 2 HTTP 服务返回的 Observable,而不是 EventEmitter。
编辑:澄清了为什么不使用 HTTP 返回的 Observable,并补充说不直接使用 RxJS 会更好。
编辑:更改描述:关注的是多个订阅,而不是合并 HTTP 结果。
谢谢!
【问题讨论】:
-
我在plnkr 中有一个使用共享的 http 示例。当您的用例使用 Http 模块时,为什么要询问将 EventEmitter 转换为某物?
-
我的描述有误导性,用例稍微复杂一些:一系列 HTTP 调用,一旦完成,我将结果合并/包装到一个新的 Observable 中。等同于 promises(angular 1 语法):
return $q.all(httpPromisesToResolve); -
其实我更关心的是如何拥有多个订阅者,并且只触发一次 HTTP 请求/触发异步进程,不管对结果做了什么转换,虽然很高兴看到什么是flatMap 可能(我学会了,谢谢:))。 @user3743222 建议的 AsyncSubject 似乎是解决方案,现在我正在检查如何在带有 RxJS lib v.5 alpha 的 Angular 2 中使用它。
-
share()在 HTTP 返回的 Observer 上运行良好(我刚刚检查过,它正在工作,转换为 hot observable),但它在 EventEmitter 上不起作用。
标签: javascript angular typescript rxjs