Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用rxjs纠正状态不变性_Javascript_Angular_Rxjs_Immutability - Fatal编程技术网

Javascript 使用rxjs纠正状态不变性

Javascript 使用rxjs纠正状态不变性,javascript,angular,rxjs,immutability,Javascript,Angular,Rxjs,Immutability,我有一个带有对象(状态)的主题,其中有很多嵌套对象 public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({ a : { prop: {...}, prop1: {...} }, b: { prop: {...}, prop1: {...} }, ... }); 嵌套对象在我的应用程序中经常更新(最多

我有一个带有对象(状态)的主题,其中有很多嵌套对象

public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({
    a : {
      prop: {...},
      prop1: {...}
    },
    b: {
      prop: {...},
      prop1: {...}
    },
   ...
  });
嵌套对象在我的应用程序中经常更新(最多1-5秒),我发现了一个问题,cloneDeep(任何深度克隆实现)会导致我的应用程序拖拉(因为我的状态非常大)

不知何故,我需要减少深层克隆的使用。我考虑不替换未更改的嵌套对象,但我不确定它在不变性方面是否正确。Smth是这样的:

const currentObject = this.testSubject.getValue();
const newB = {...}; // maybe deepCopy of currentObject.b + changes
this.testSubject.next({
  ...currentObject,
  b: newB,
});

请让我知道,在不变性方面,在更新状态时不制作所有嵌套属性的深度副本,而只制作已更改的嵌套对象及其子对象的深度副本是否可以(如上一个代码片段所示)

不变性保证您使用的实例不会被其他人修改


如果您保证在处理(或读取)对象时控制对象的修改,那么第二个解决方案就可以了。

如示例所示,不制作未更改的嵌套对象/数组的完整副本也可以


但同样重要的是,我们决定规范化我们的状态,以摆脱深层嵌套对象。

AFAIK,只要状态对象中没有函数,您的最后一个代码片段就可以正常工作。这似乎是NGRX之类的东西的一个很好的候选对象。。
public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({
    a : {
      prop: {...},
      prop1: {...}
    },
    b: {
      prop: {...},
      prop1: {...}
    },
   ...
  });