mostjs - создание потоков из пользовательских источников

Мне любопытно узнать о современных рекомендациях по созданию потоков из источников, которые могут не соответствовать существующему методу создания потоков ( 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?

Есть ли лучшие способы, которые я пропускаю?

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, так как EventEmitterSource выполняет планирование события на следующем тике цикла событий и обрабатывает удаление прослушивателя событий, когда поток заканчивается.

Проверьте, как использовать @most/create

https://github.com/mostjs/create

Это позволяет вручную генерировать события - подобно тому, как вы это делаете с rxJS

Другие вопросы по тегам