这真的是从事件callback中获得Rx.Observable的最好方法吗?

我想从datamaps库中获取一系列事件,但由于该库并没有真正用Reactive Programming编写,所以我很难将任何发送的事件映射到Observable。 我迄今为止的最好的尝试是这样的,但它并不那么习惯。 这是我能做的最好的,或者我可能会错过一些基本的RxJs构造,这将使这个更好/更简单/更具可读性?

import Rx from 'rx'; import {EventEmitter} from 'events'; import Datamap from 'datamaps'; const eventEmitter = new EventEmitter(); const mapEvents$ = Rx.Observable.fromEvent( eventEmitter, 'mapEvent' ) const map = new Datamap({ element: document.getElementById('map'), done: (datamap) => { datamap.svg .selectAll('.datamaps-subunit') .on('mouseover', (o) => { eventEmitter.emit('mapEvent', o); }); } }); 

看起来你正在使用EventEmitter作为事件总线,但是我们已经有了可以使用的主题 。 主题是观察者和观察者,这意味着你可以调用onNext给他们下一个事件,你可以在可观察序列上使用操作符。

简单地说,我会重写它是这样的:

 import Rx from 'rx'; import Datamap from 'datamaps'; const datamapsSubject = new Rx.Subject(); const map = new Datamap({ element: document.getElementById('map'), done: (datamap) => { datamap.svg .selectAll('.datamaps-subunit') .on('mouseover', (o) => { datamapsSubject.onNext(o); }); } }); 

如果你需要的东西,你可以构build订阅和销毁/取消订阅,你也可以考虑Observable.create ,但它看起来像你只是针对目前的一个div元素。