结合共享RxJS受试者我有一个单独服务用于应用设置用于双向数据在角2
class Setting {
get foo() {
return storage.get('foo');
}
set foo(val)
storage.set('foo', val);
}
}
了在组件的视图绑定为setting.foo
。
由于storage
调用可能代价高昂,因为它可能是异步的,所以我宁愿用RxJS主题替换getter/setter,它可以在需要时更新并读取storage
。
所以我就来重构
class Setting {
constructor() {
this.fooSubject = new ReplaySubject(1);
fooSubject.subscribe((val) => {
storage.set('foo', val);
});
this.foo$ = this.fooSubject
.map(() => storage.get('foo'))
.publishReplay(1).refCount();
}
,并使用它像setting.foo$ | async
和setting.fooSubject.next(newFoo)
。它看起来像昂贵的storage.get
调用现在被缓存。
有两个问题。
第一个问题是fooSubject
主题和foo$
可见的应公开可用于做这项工作,而选择一个主题,因为它应该是一个可观察的和观察者。
可以foo$
被做成Setting
服务的单一主题属性,因此它可以与subscribe(...)
认购,并与next(...)
更新?
第二个是代码仍然是同步的。
如何处理storage.get
和storage.set
返回承诺?
感谢您的回复。目标是将'setting.foo'属性暴露为* single *可读/可写属性(subject),而不是像现在这样的getter和setter对('setting'上可能会有更多这样的属性)。我即将使用承诺不是因为“存储”耗时,而是因为目前我使用同步API(localStorage),我期望它会切换到异步(localForage)。 – estus
然后我认为你可以把我的'Setting'版本作为你的'Setting'中的一个项目用作'setting.foo',或者甚至可以创建你自己的Subject来扩展'ReplaySubject' :)。 – martin
我对主题和子类化并不是很满意,但这似乎是一个非常好的主意,所以谢谢。 – estus