【问题标题】:mostjs - creating streams from custom sourcesmostjs - 从自定义源创建流
【发布时间】:2016-12-08 04:43:13
【问题描述】:

我很好奇当前从可能不符合现有流创建方法的源创建流的最佳实践 (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) })
})

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

我还有没有更好的方法?

【问题讨论】:

    标签: javascript observable cujojs mostjs


    【解决方案1】:

    查看@most/create的使用方法

    https://github.com/mostjs/create

    它允许手动发出事件 - 类似于使用 rxJS 的方式

    【讨论】:

      【解决方案2】:

      另一种选择可能是填充您的 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 更好,因为the EventEmitterSource 在事件循环的下一个滴答中执行事件调度,并在流结束时处理事件侦听器。

      【讨论】:

        猜你喜欢
        • 2018-05-16
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多