javascript - 这真的是从事件回调中获取 Rx.Observable 的最佳方式吗?

标签 javascript node.js browserify rxjs eventemitter

我想从 datamaps 库中获取事件流,但由于该库在编写时并没有真正考虑到响应式编程,所以我很难将任何发出的事件从它映射到 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 作为事件总线,但我们已经有了 Subjects你可以改用。主题既是观察者又是可观察对象,这意味着您可以对它们调用 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);
      });
  }
});

如果您需要可以在订阅时构建并在处置/取消订阅时销毁的东西,您还可以考虑 Observable.create , 但看起来您现在只针对一个 div 元素。

关于javascript - 这真的是从事件回调中获取 Rx.Observable 的最佳方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982053/

相关文章:

Node.js 延续本地存储使用

javascript - 在 ReactJS 中需要来自另一个文件的类

node.js - 使用 Bower Ember CLI 导入依赖项 - 找不到模块

javascript - 无法将最后两张图像居中,第一张图像被夸大了

javascript - 将 prevstate 参数添加到 this.setState 会导致 typeError

javascript - on.('click) 动态创建的元素在执行时被调用而无需单击

javascript - 无法在 AngularJS 中注册模块

node.js - 403禁止 express 。无法接受授权 header

javascript - 如何将 Canvas 数据 uri 上传到 amazon s3 服务器

javascript - 在文件夹中运行所有浏览器化的 Mocha 测试