結合共享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