订阅JavaScript中的地图数据结构不会';行不通

订阅JavaScript中的地图数据结构不会';行不通,javascript,observable,Javascript,Observable,我一直试图观察JavaScript中Map对象的变化,但由于某些原因,只能观察对象的创建。在地图上添加/删除数据时,可观察对象是否不起作用 以下是可观察到的结果: test(): Observable<Map<string, Object>> { return of(this.testModel.test()); } test():可观察{ 返回(this.testModel.test()); } 这是我订阅的: test(): Observable<

我一直试图观察JavaScript中Map对象的变化,但由于某些原因,只能观察对象的创建。在地图上添加/删除数据时,可观察对象是否不起作用

以下是可观察到的结果:

  test(): Observable<Map<string, Object>> {
    return of(this.testModel.test());
}
test():可观察{
返回(this.testModel.test());
}
这是我订阅的:

test(): Observable<Map<string, Object>> {

let mapOb = this.testModel.test();
    return Observable.create((obsrvr) => {
      const originalSet = mapOb.set;
      const originalDelete = mapOb.delete;
      mapOb.set = (...args) => {
        obsrvr.next(originalSet.call(mapOb, ...args));
      };

      mapOb.delete = (...args) => {
        obsrvr.next(originalDelete.call(mapOb, ...args));
      }
    });
}
test():可观察{
设mapOb=this.testModel.test();
返回可观察的。创建((obsrvr)=>{
常量originalSet=mapOb.set;
const originalDelete=mapOb.delete;
mapOb.set=(…参数)=>{
obsrvr.next(originalSet.call(mapOb,…args));
};
mapOb.delete=(…参数)=>{
obsrvr.next(originalDelete.call(mapOb,…args));
}
});
}
我在创建映射期间看到log语句,但是如果我向映射添加任何新条目,则不会记录任何内容。有人知道为什么会这样吗

我在maoOb.set和mapOb.delete处遇到错误:

Type '(key: string, value: Object) => void' is not assignable to type '(key: string, value: Object) => Map<string, Object>'.
  Type 'void' is not assignable to type 'Map<string, Object>'
Type'(键:字符串,值:对象)=>void'不可分配给Type'(键:字符串,值:对象)=>Map'。
类型“void”不可分配给类型“Map”

当您想要监听地图中数据的添加/删除时,您当前的方法似乎不正确

您只是使用(对象引用)的
返回一个可观察的对象,这将无法知道您正在对与它一起传递的对象执行的操作

在MapInstance上执行set()或delete()时,需要有一个Observable

您可以通过这种方式修改地图实例以实现所需

createObservable(mapOb) {
  return Observable.create((obsrvr) => {
    const originalSet = mapOb.set;
    const originalDelete = mapOb.delete;
    mapOb.set = (...args) => {
      const setReturn = originalSet.call(mapOb, ...args);
      obsrvr.next(setReturn);
      return setReturn;
    };

    mapOb.delete = (...args) => {
      const deleteReturn = originalDelete.call(mapOb, ...args);
      obsrvr.next(deleteReturn);
      return deleteReturn;
    }
  });

}
将映射传递给createObservable()方法并订阅它。在这个方法中,我修改了地图的
set
delete
方法,以便在调用这些方法时它会发出一个值


我已经为答案创建了一个虚拟示例:

当您想要监听地图中数据的添加/删除时,您当前的方法似乎不正确

您只是使用(对象引用)
返回一个可观察的对象,这将无法知道您正在对与它一起传递的对象执行的操作

在MapInstance上执行set()或delete()时,需要有一个Observable

您可以通过这种方式修改地图实例以实现所需

createObservable(mapOb) {
  return Observable.create((obsrvr) => {
    const originalSet = mapOb.set;
    const originalDelete = mapOb.delete;
    mapOb.set = (...args) => {
      const setReturn = originalSet.call(mapOb, ...args);
      obsrvr.next(setReturn);
      return setReturn;
    };

    mapOb.delete = (...args) => {
      const deleteReturn = originalDelete.call(mapOb, ...args);
      obsrvr.next(deleteReturn);
      return deleteReturn;
    }
  });

}
将映射传递给createObservable()方法并订阅它。在这个方法中,我修改了地图的
set
delete
方法,以便在调用这些方法时它会发出一个值


我为答案创建了一个虚拟示例:

您是指RxJS
可观察的吗?如果是这样的话,搜索结果会返回多个结果,例如,“如果我向地图添加任何新条目,则不会记录任何内容”-为什么会记录任何内容?你没有地图变化的可观察性,你有一个可观察性,它发出一个值,地图本身。你的代码不完整,导致混乱。测试是否返回自身的可观察性?testModel.test()返回什么?承诺?@DaveNewton是的,我指的是RxJS可见物。@jonrsharpe你能再澄清一下吗?我怀疑我可能观察错了东西。你如何观察地图的变化?你指的是RxJS
Observable
s吗?如果是这样的话,搜索结果会返回多个结果,例如,“如果我向地图添加任何新条目,则不会记录任何内容”-为什么会记录任何内容?你没有地图变化的可观察性,你有一个可观察性,它发出一个值,地图本身。你的代码不完整,导致混乱。测试是否返回自身的可观察性?testModel.test()返回什么?承诺?@DaveNewton是的,我指的是RxJS可见物。@jonrsharpe你能再澄清一下吗?我怀疑我可能观察错了东西。如何观察映射的更改?我得到一个错误:``Type'(键:字符串,值:对象)=>void'不可分配给Type'(键:字符串,值:对象)=>map'。类型“void”不可分配给类型“Map”```@BlueMoose,你能用你尝试过的任何东西更新你的问题吗?以及你得到错误的那一行吗?事实上它确实起作用了。我的错。非常感谢你的帮助@BlueMoose:我们没有返回值
set/delete
,这就是它抱怨的原因。查看编辑,它现在不应该抱怨它。我得到一个错误:``Type'(key:string,value:Object)=>void'不能分配给Type'(key:string,value:Object)=>Map'。类型“void”不可分配给类型“Map”```@BlueMoose,你能用你尝试过的任何东西更新你的问题吗?以及你得到错误的那一行吗?事实上它确实起作用了。我的错。非常感谢你的帮助@BlueMoose:我们没有返回值
set/delete
,这就是它抱怨的原因。查看编辑,它现在不应该抱怨它。