2017-08-07 135 views
1

我正在封装一个在Observables中发出事件的API,目前我的数据源代码看起来像这样,db.getEventEmitter()返回EventEmitter如何使用Observables作为惰性数据源

const Datasource = { 
    getSomeData() { 
    return Observable.fromEvent(db.getEventEmitter(), 'value'); 
    } 
}; 

但是,实际上用这个,我需要在两个memoize的功能,并使其返回一个ReplaySubject,否则getSomeData()每个后续调用将重新初始化整个序列并重新创建多个事件发射器或没有任何数据,直到下一次更新,这是不可取的,所以我的代码看起来更像是这对每一个功能

const someDataCache = null; 
const Datasource = { 
    getSomeData() { 
    if (someDataCache) { return someDataCache; } 
    const subject = new ReplaySubject(1); 
    Observable.fromEvent(db.getEventEmitter(), 'value').subscribe(subject); 
    someDataCache = subject; 
    return subject; 
    } 
}; 

它最终被相当多的样板只是一个单一的功能,成为更大的问题时,有是更多的参数。

有没有更好的/更优雅的设计模式来实现这一目标?基本上,我希望

  1. 只有一个事件发射器被创建。
  2. 稍后调用数据源的调用者将获得最新的结果。
  3. 事件发射器在需要时创建。

但是现在我觉得这个模式与Observable模式相抵触,产生了一堆样板。

+1

“参数集”的含义并不十分清楚。另外,你看过'publishReplay'吗? http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-publishReplay – cartant

+0

@cartant啊,这似乎正是我要找的!感谢您指点我正确的方向。如果有更多的文档,它会很好,但我只搜索了一些搜索的例子。 – kevmo314

+0

文档将最终到达那里。你总是可以回到[v4文档](https://github.com/Reactive-Extensions/RxJS/tree/master/doc)。如果您熟悉[v4和v5之间的更改](https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md),它们仍然有用。 – cartant

回答

0

作为这个问题的后续,我最终通过这种方式来共同利用Observables的逻辑。 publishReplay正如上面提到的cartant让我获得了我所需要的大部分路。我记录了我在this post中学到的内容,其中包含以下内容:dr代码:

let first = true 
Rx.Observable.create(
    observer => { 
    const callback = data => { 
     first = false 
     observer.next(data) 
    } 
    const event = first ? 'value' : 'child_changed' 
    db.ref(path).on(event, callback, error => observer.error(error)) 
    return {event, callback} 
    }, 
    (handler, {event, callback}) => { 
    db.ref(path).off(event, callback) 
    }, 
) 
.map(snapshot => snapshot.val()) 
.publishReplay(1) 
.refCount() 
相关问题