rx js труба крана / карта не срабатывает при подписке - PullRequest
1 голос
/ 11 марта 2020

Я не знаю, почему, но когда я использую Observable с методом расширения и каналом, карта канала или отвод не запускаются.

import { Observable, Subscriber, Observer } from 'rxjs';
import { tap, map } from 'rxjs/operators';
...
declare module 'rxjs' {
    interface Observable<T> {
        useCache<T>(this: Observable<T>, key: string): Observable<T>;
    }
}
Observable.prototype.useCache = function<T>(this: Observable<T>, key: string) {
    // executed
    const inCache = LocalStorage.get(key);
    if (inCache) {
        return new Observable<T>(observer => observer.next(inCache));
    }
    // this.pipe(tap((e: T) => {
    //     LocalStorage.set(key, e);
    // }));

    this.pipe(map((e: T) => {
        //not executed
        LocalStorage.set(key, e);
    }));
    return this;
};
...
(in somewhere component)
this.service.get(...).subscribe(e=>{
    //executed!
});

В других местах я могу установить точки останова, которые останавливаются там, но не внутри карты лямбда-функция

1 Ответ

2 голосов
/ 11 марта 2020

Объект this не изменяется. Попробуйте вернуть this с прикрепленной трубкой. И поскольку вы не отображаете, вы можете просто использовать tap.

Observable.prototype.useCache = function<T>(this: Observable<T>, key: string) {
  const inCache = LocalStorage.get(key);
  if (inCache) {
    return of(inCache);
  }
  return this.pipe(
    tap((e: T) => LocalStorage.set(key, e))
  );
};
...