Javascript Rx CombineTest等待两个可观测物发射
比如说,我有一个保存ID和实体的商店,当它们发生变化时,我需要将它们合并Javascript Rx CombineTest等待两个可观测物发射,javascript,rxjs,ngrx,Javascript,Rxjs,Ngrx,比如说,我有一个保存ID和实体的商店,当它们发生变化时,我需要将它们合并 const state = { ids: [], entities: {} } const store = new BehaviorSubject(state); Observable.combineLatest( store.map(state => state.ids).distinctUntilChanged(), store.map(state => state.entities)
const state = {
ids: [],
entities: {}
}
const store = new BehaviorSubject(state);
Observable.combineLatest(
store.map(state => state.ids).distinctUntilChanged(),
store.map(state => state.entities).distinctUntilChanged(),
(ids, entities) => {
return ids.map(id => entities[id])
}
).subscribe(console.log);
store.next({ids: [1], entities: {1: {id: 1}}})
上述代码的问题是,由于实体和ID都发生了更改,选择器函数将被调用两次
有没有操作员来解决这个问题?如果没有,我如何创建一个解决这个问题的方法
我想到了一个特殊的测试。等待一段时间,然后将他们的下一个()联合起来
注意:它应该支持添加、更新和删除
zip操作符将求解、添加和删除,因为在这种情况下,我同时更新ID和实体,但更新实体将不起作用 操作员应该做这项工作
store.map(state => state.entities).distinctUntilChanged().withLatestFrom(
store.map(state => state.ids).distinctUntilChanged(), (entities, ids) => ids.map(id => entities[id])
).subscribe(console.log);
// Add
store.next({
ids: [1],
entities: {
1: {
id: 1,
name: 'A'
}
}
});
// Update
store.next({
...store.getValue(),
entities: {
1: {
name: 'B'
}
}
});
// Delete
store.next({
ids: store.getValue().ids.filter(id => id !== 1),
entities: {}
});
withlatestfrom或zip可能适用于您的案例?不,例如,当我更新实体时,它将不包括案例。也许其中一个将帮助您找到所需的操作员。