1

我很好奇当前从可能不符合现有流创建方法的源创建流的最佳实践(https://github.com/cujojs/most/blob/master/docs/api.md

使用 Firebase 的示例ref.on('child_added', function(snap){})

most.fromEvent('child_added', ref) //ERROR

我不能使用.fromEvent...虽然 ref 实现了某种on,但它似乎不符合 EventEmitter 接口(addEventListener、removeEventListener)


ref.on('child_added', function(snap){ emitter.emit('value', snap) })

most.fromEvent('value', emitter)

手动发出事件,是我目前能想到的最好的......


// https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md

Rx.Observable.create(function(observer){
  ref.on('child_added', function(snap){ observer.next(snap) })
})

是否有类似的机制来自定义创建流,例如 la Rx?

我有没有更好的方法?

4

2 回答 2

1

另一种选择可能是填充您的 firebase 库公开的接口以适合大多数fromEvent构造函数。

查看 的源代码fromEvent,我们可以看到它支持两个事件源接口:

有了这些知识,我们可以实现一个 shim 函数来从{ on, off }接口创建一个流:

function fromEvent (eventName, source) {
  if (typeof source.on === 'function' && typeof source.off === 'function') {
    return most.fromEvent(eventName, {
      addListener: source.on,
      removeListener: source.off
    });
  } else {
    return most.fromEvent.apply(null, arguments)
  }
}

这可能比使用更好create,因为EventEmitterSource在事件循环的下一个滴答声中执行事件调度,并在流结束时处理事件侦听器的处置。

于 2016-12-07T20:36:51.177 回答
1

检查如何使用@most/create

https://github.com/mostjs/create

它允许手动发出事件 - 类似于您将如何使用它rxJS

于 2016-12-07T19:08:24.113 回答