Подписка на структуру данных карты в JavaScript не работает - PullRequest
0 голосов
/ 04 мая 2020

Я пытался наблюдать изменения в объекте карты в 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));
      }
    });
}

I см. оператор 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>'

1 Ответ

1 голос
/ 04 мая 2020

Ваш текущий подход не кажется правильным, когда вы хотите прослушать добавление / удаление данных на карте.

Вы просто возвращаете Observable, используя of(Object Reference), это никоим образом не будет знать о вещах что вы делаете с Объектом, который вы передаете ему.

Вам необходимо иметь Observable, который генерируется при выполнении set () или delete () над MapInstance.

Вы можете изменить ваш экземпляр 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 () и подпишитесь на него. В этом методе я изменил методы set и delete вашей карты, чтобы при вызове этих методов она выдавала значение.

Я создал фиктивный пример для ответа: Ссылка.

...