来自 EventEmitter 的热共享 Observable

2023-12-26

有没有办法从一个EventEmitter(或 Angular 2 alpha 46 / RxJS 5 alpha 中可用的等效项)? IE。如果我们在值解析后订阅,它将使用之前解析的值触发。类似于我们总是返回相同的承诺。

理想情况下,仅使用 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();

这里完全是冷热比较 http://plnkr.co/edit/zVte4KFHX4f6Cp97lbtu?p=preview

Usecase:某些异步对象仅到达一次(例如,一系列 HTTP 调用合并/包装在一个new EventEmitter),但将已解析的异步对象提供给订阅它的任何服务/组件,即使它们是在解析后订阅的(收到 HTTP 响应)。

编辑:问题不在于如何合并 HTTP 响应,而是如何从 EventEmitter 或 Angular 2 alpha 46 / RxJS 5 alpha 中可用的任何等效项获取(热门?)可观察值,允许在检索/解析异步结果后进行订阅(HTTP 只是异步源的一个示例)。myEventEmitter.share() 不起作用(参见上面的 plunker),尽管它与 HTTP 返回的 Observable 一起工作(参见笨蛋来自 http://plnkr.co/edit/GFdXPncYPxx0IcqIwQnO?p=preview@埃里克·马丁内斯)。从 Angular 2 alpha 46 开始,.toRx() 方法不再存在,EventEmitter 是可观察对象和主题本身。

只要我们始终返回相同的 Promise 对象,这对于 Promise 来说就很有效。由于我们在 HTTP Angular 2 服务中引入了观察者,所以我想避免混合 Promise 和观察者(据说观察者比 Promise 更强大,所以它应该允许使用 Promise 做一些简单的事情)。

有关 share() 的规范 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md(我还没有找到版本 5 alpha 的文档 - Angular 2 使用的版本) - 正在研究Observable由 Angular 2 HTTP 服务返回,不适用于 EventEmitter。

编辑:澄清了为什么不使用 HTTP 返回的 Observable 并补充说不直接使用 RxJS 会更好。

编辑:更改了描述:关注的是多个订阅,而不是合并 HTTP 结果。

Thanks!


您似乎描述的功能不是冷可观察的功能,而是不仅仅是一个Rx.BehaviourSubject。看看这里关于 Rxjs 主题的解释:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md.

我从那里引用:

BehaviourSubject 与 ReplaySubject 类似,不同之处在于它只存储最后发布的值。 BehaviourSubject 在初始化时也需要一个默认值。当主题尚未收到其他值时,该值将发送给观察者。这意味着所有订阅者将在订阅时立即收到一个值,除非主题已经完成。

The Rx.AsyncSubject将是最接近承诺的行为:

AsyncSubject 与 Replay 和 Behavior 主题类似,但它只会存储最后一个值,并且仅在序列完成时发布它。当源 observable 很热并且可能在任何观察者订阅它之前完成时,您可以使用 AsyncSubject 类型。在这种情况下,AsyncSubject 仍然可以提供最后一个值并将其发布给任何未来的订阅者。

还有两条评论:

  • 在你的笨蛋中:this._coldObservable = emitter.share();. Using share返回一个热可观察值!
  • EventEmitter实际上首先扩展了主题

UPDATE :将 EventEmitter 包裹在Rx.Observable:

function toRx ( eventEmitter ) {
  return Rx.Observable.create(function ( observer ) {
    eventEmitter.subscribe(function listener ( value ) {observer.onNext(value)});
    // Ideally you also manage error and completion, if that makes sense with Angular2
    return function () {
      /* manage end of subscription here */
    };
  };
)
}

一旦你拥有了Rx.Observable,你可以申请share(), shareReplay(1), 任何你想要的。

我敢打赌,Angular 团队迟早会提出桥接功能,但如果你不想等待,你可以自己做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 EventEmitter 的热共享 Observable 的相关文章

随机推荐