Rx JS Связь наблюдаемых проблем - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь изменить свой текущий код, вызывая наблюдаемый объект в другом наблюдаемом коде, используя карту слияния

Этот код действительно работает, но я знаю, что это плохая практика, поэтому я пытаюсь его реорганизовать

this._headerRefresh$.pipe(debounceTime(this.debounceTime)).subscribe(data => {
            this._outputProvider
                .getData(this.to.url, this.to.body ? this.to.body : undefined)
                .pipe(
                    debounceTime(this.debounceTime),
                )
                .subscribe(res => {
                    this.setstuff(res);
                });
        });

Я пытался сделать это таким образом, но он не совсем вызывает this.setstuff (res)

this._headerRefresh$
        .pipe(
          debounceTime(this.debounceTime),
          mergeMapTo(
            this._outputProvider
              .getData(this.to.url, this.to.body ? this.to.body : undefined)
          ),
        )
        .subscribe(res => {
          console.log(res);
          this.setstuff(res);
        });

Есть что-нибудь, что я пропустил?

1 Ответ

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

если this.to.url и this.to.body являются динамическими c, вы не можете использовать mergeMapTo ... вы должны использовать mergeMap, чтобы их можно было повторно оценивать при каждом выбросе, а не только один раз, когда поток построен:

      mergeMap(() =>
        this._outputProvider
          .getData(this.to.url, this.to.body ? this.to.body : undefined)
      ),

вы также можете действительно захотеть switchMap или exhaustMap вместо mergeMap ... поведение немного отличается.

с mergeMap, каждое излучение внешнего будет запускать внутреннее, и все внутренние будут излучать, пока они не завершатся. они прибудут в том порядке, в котором они прибыли, а не в том порядке, в котором они были инициированы внешним источником. так что это может привести к ненужным http-вызовам в лучшем случае или получению устаревших данных в худшем случае.

с switchMap новые выбросы приведут к отмене предыдущих внутренних наблюдаемых, которые все еще активны, и это приведет к переключиться на новый звонок.

exhaustMap - это своего рода противоположность, он будет игнорировать внешние выбросы, пока активен любой внутренний. он редко используется, но сигнал refre sh - это вариант использования classi c, поскольку обычно вы не хотите перезапускать refre sh или запускать больше, пока refre sh уже находится в полете.

...