Javascript Rx CombineTest等待两个可观测物发射

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)

比如说,我有一个保存ID和实体的商店,当它们发生变化时,我需要将它们合并

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可能适用于您的案例?不,例如,当我更新实体时,它将不包括案例。也许其中一个将帮助您找到所需的操作员。