Angular - RxJS - Как выполнить действия для отфильтрованных элементов в цепочке? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть труба, подобная этой:

this.parentFormControl.valueChanges
  .pipe(
    debounceTime(500),
    distinctUntilChanged(),
    tap(() => {
      this.focusIndex = -1;
    }),
    filter(() => this.myCondition()),
    switchMap((value: string) => {
      return this.http.get(value).pipe(catchError(err => {
        this.myErrorFunction(err);
        return EMPTY;
      }));
    })
  )

И я хотел бы выполнить некоторые другие «побочные» действия, как в операторе крана, для элементов, которые фильтруются -removed- (которые вернули 'false 'из' myCondition () 'так сказать) Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы можете разделить цепочку, используя multicast, а затем добавить tap для обоих условий и после этого просто игнорировать результаты, которые вам не нужны:

range(1, 10)
  .pipe(
    multicast(() => new Subject(),
      o => merge(
        o.pipe(
          filter(v => v % 2 === 0),
          tap(v => console.log('true', v)),
        ),
        o.pipe(
          filter(v => v % 2 !== 0),
          tap(v => console.log('false', v)),
          ignoreElements(),
        ),
      )
    ),
  )
  .subscribe(v => console.log('result', v));

Это немного длинно, но правильно расщепляетсяисточник в две цепочки.

Демонстрация в реальном времени: https://stackblitz.com/edit/rxjs6-demo-yarhux?file=index.ts

0 голосов
/ 08 октября 2018

Вы можете добавить условие для проверки в вашем кране перед фильтром.

this.parentFormControl.valueChanges
  .pipe(
    debounceTime(500),
    distinctUntilChanged(),
    tap((x) => {
      this.focusIndex = -1;
      if (!this.myCondition()) console.log(x); // here
    }),
    filter(() => this.myCondition()),
    switchMap((value: string) => {
      return this.http.get(value).pipe(catchError(err => {
        this.myErrorFunction(err);
        return EMPTY;
      }));
    })
  )
...