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
мы видим, что он поддерживает два интерфейса для источников событий:
{ 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
, так как EventEmitterSource выполняет планирование события на следующем тике цикла событий и обрабатывает удаление прослушивателя событий, когда поток заканчивается.
Проверьте, как использовать @most/create
https://github.com/mostjs/create
Это позволяет вручную генерировать события - подобно тому, как вы это делаете с rxJS