byg*_*ace 5 javascript rxjs ngrx angular
我在相关应用程序中使用以下库:Angular 4.x、ngrx 4.x、rxjs 5.4.x
在我的应用程序中,我能够从 websocket 获取一些数据,但对于某些数据,我必须使用 RESTful api。我正在通过 ngrx 在多个组件之间共享数据。现在我根据创建、更新和删除等事件重新获取数据。
我不希望对数据进行太多的并发修改,但我确实需要一种方法来手动或自动确保我的客户端状态与服务器匹配。我想进行修补客户端状态的乐观更新,而不是承担对相关状态片进行完整数据刷新的成本。
如果我不使用 ngrx,那么我可能只有一个服务,它会暴露一个如下所示的可观察对象,它会缓存 api 调用的最新结果并与所有订阅者共享它。它会偶尔更新结果,但前提是它有订阅者。
const interval = 1000;
let counter = 0;
// setup a timer that executes immediately and on a timer
let call = Rx.Observable.timer(0, interval)
// make the fake async call
.switchMap(() => Rx.Observable.of(counter++).delay(100))
.do(x => console.log('call', x))
// cache latest value and share the value with all subscribers
.publishReplay(1, interval)
// only connect (aka make the call) if there are more than 1 subscribers
.refCount();
// convenience method for simulation
function subscribe(name, take) {
call.take(take).subscribe(
x => { console.log(name, x); },
null,
() => { console.log(`${name} completed`) }
);
}
// observers
subscribe('first', 1);
subscribe('second', 2);
window.setTimeout(() => {
subscribe('third', 3);
}, 3500);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>Run Code Online (Sandbox Code Playgroud)
我不确定如何用 ngrx 模仿相同的行为,因为 ngrx 处理对自身的订阅。在许多方面,它会断开订阅与源的连接。以下是我仔细考虑的一些想法:
store.select但我认为我必须定义已经在减速器中定义的效果和状态之间的显式关系。仅当相关数据切片上有活动订阅时,如何才能按时间间隔提取数据以更新 ngrx 存储?
我不认为我 100% 理解发生了什么。但我想我会做这样的事情: