Как отписаться сразу после того, как условие выполнено в RxJs - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в наблюдаемых RxJs и испытываю трудности с отпиской от цикла после того, как критерии выполнены, не могли бы вы помочь мне

В функции ниже, если в любое время код достигает блока if, я хотел отписаться от Observables

Перед тем, как задавать эти вопросы, я прошел нижеприведенные вопросы, и ни один из них мне не очень помог

  1. Наблюдаемые Rxjs ждут, пока какое-либо условие будет выполнено
  2. AngularJs - RXJS Наблюдаемая отписка

Функция Javascript

this.router.events.subscribe((url: any) => {
    url = this.router.url;
    if ((url === "/profile" || url === "/summary") && this.filterConfigFlag === false) {

        /*
        Perform operations
        */

    } else {
        console.log(typeof (url), url);

    }
});

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы, вероятно, хотите takeWhile:

this.router.events
  .pipe(
    takeWhile(url => url === ...), // when the condition isn't met it'll complete immediatelly
  )
  .subscribe(...);

но если вы хотите включить также последнее значение (значение, которое завершило наблюдаемое), вам нужно будет сделать что-то вроде этого:

this.router.events
  .pipe(
    concatMap(url => url === ... ? of(url, null) : of(url)),
    takeWhile(Boolean),
  )
  .subscribe(...);
0 голосов
/ 05 июля 2018

Вы можете использовать операторы Subject и takeUntil следующим образом:

unsubscribe = new Subject<any>();

this.router.events.pipe(takeUntil(unsubscribe)).subscribe((url: any) => {
    url = this.router.url;
    if ((url === "/profile" || url === "/summary") && this.filterConfigFlag === false) {

        /*
        Perform operations
        */
this.unsubscribe.next();
    } else {
        console.log(typeof (url), url);
this.unsubscribe.next();
    }
});
...