【问题标题】:Subscribing to Map Data Structure in JavaScript doesn't work在 JavaScript 中订阅地图数据结构不起作用
【发布时间】:2020-08-18 22:27:11
【问题描述】:

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

这是可观察的:

  test(): Observable<Map<string, Object>> {
    return of(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));
      }
    });
}

我在地图创建过程中看到了日志语句,但如果我向地图添加任何新条目,则不会记录任何内容。有人知道为什么会这样吗?

我在 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>'

【问题讨论】:

  • 你指的是 RxJS Observables 吗?如果是,则搜索此返回多个结果,例如,stackoverflow.com/q/32683488/438992gist.github.com/jayphelps/d8641e7213b56d368e7b 等。
  • “如果我向地图添加任何新条目,则不会记录任何内容” - 为什么记录任何内容?您没有对地图进行更改的可观察对象,您有一个发出单个值的可观察对象,即地图本身。
  • 您的代码不完整导致混淆。测试是否返回自身的可观察值? this.testModel.test() 返回什么?承诺?
  • @DaveNewton 是的,我指的是 RxJS Observable。
  • @jonrsharpe 你能澄清更多吗?我怀疑我可能观察到了错误的事情。您如何观察地图的变化?

标签: javascript observable


【解决方案1】:

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

您只是使用of(Object Reference) 返回一个 Observable,这将无法知道您对传递给它的 Object 所做的事情。

您需要有一个 Observable,当您在 MapInstance 上执行 set() 或 delete() 时会发出。

您可以通过这种方式修改您的 Map 实例以实现您想要的。

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() 方法并订阅它。在这个方法中,我修改了您地图的setdelete 方法,以便在调用这些方法时发出一个值。

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

【讨论】:

  • 我得到一个错误:``` Type '(key: string, value: Object) => void' is notassignable to type '(key: string, value: Object) => Map'。类型 'void' 不可分配给类型 'Map'。 ```
  • @BlueMoose,您可以用您尝试过的任何内容以及出现错误的行来更新您的问题吗?
  • 实际上它确实有效。我的错。非常感谢你的帮助!!
  • @BlueMoose:我们没有返回值set/delete,这就是它抱怨的原因。查看编辑,它现在不应该抱怨它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2016-09-26
  • 2021-06-05
  • 2020-09-29
  • 2020-03-24
  • 1970-01-01
相关资源
最近更新 更多