我对当前从可能不符合现有流创建方法(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 )?
还有更好的方法让我错过吗?
发布于 2016-12-07 19:08:24
发布于 2016-12-07 20:36:51
另一种选择可能是对防火墙库公开的接口进行调整,以适应most的fromEvent构造函数。
查看fromEvent的源代码,我们可以看到它支持事件源的两个接口:
{ addEventListener, removeEventListener } - EventTarget接口,通常由DOM元素实现{ addListener, removeListener } - EventEmitter接口,经常在节点库中找到有了这些知识,我们就可以实现一个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更好,因为the EventEmitterSource在事件循环的下一个滴答上执行事件调度,并在流结束时处理事件侦听器的处理。
https://stackoverflow.com/questions/41023748
复制相似问题