【发布时间】:2018-05-15 19:15:50
【问题描述】:
上下文
我在相关应用程序中使用以下库:Angular 4.x、ngrx 4.x、rxjs 5.4.x
在我的应用程序中,我能够从 websocket 获取一些数据,但对于一些我必须使用 RESTful api。我正在通过 ngrx 在多个组件之间共享数据。现在我根据创建、更新和删除等事件重新获取数据。
我不希望对数据进行太多并发修改,但我确实需要一种手动或自动确保我的客户端状态与服务器匹配的方法。我想做乐观的更新来修补客户端状态,而不是产生对相关状态片进行完整数据刷新的成本。
RxJs 方法
如果我不使用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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
问题
我不确定如何使用 ngrx 模拟相同的行为,因为 ngrx 会处理对自身的订阅。在许多方面,它断开了订阅与源的连接。以下是我考虑过的一些想法:
- 也许有一种方法可以让我回避拳头
store.select,但我认为我必须明确定义效果和状态之间的关系,这些关系已经在 reducer 中定义。 - 我可以让每个页面/组件注册它感兴趣的内容并以这种方式跟踪订阅,但这实际上只是复制订阅。
- 我可以为位于 ngrx 前面的每个状态切片设置投影,并以某种方式触发相关效果,但这似乎很棘手,并且可能令人费解。
- 辞掉工作,以卖宠物石为生。
问题
只有在相关数据片上有活动订阅时,我才能按时间间隔提取数据以更新 ngrx 存储?
【问题讨论】:
标签: javascript angular rxjs ngrx