Угловой RxJS: условный оператор (если еще) - PullRequest
2 голосов
/ 04 июня 2019

Я пытаюсь понять, как реализовать простую условную операцию в наблюдаемую.

this.deactivate$
    .pipe(
        filter((canDeactivate) => !canDeactivate),
        switchMap(() => Observable.of(window.confirm("message")))
    );

Я хочу получить следующее:

if (canDeactivate) {
    return canDeactivate;
}
else {
    return window.confirm("message");
}

Проблема вПервый приведенный выше код заключается в том, что при фильтрации пропущенного значения остальные операторы не выполняются, и поток останавливается для заполнения пропущенного значения.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

Вы можете решить, какой наблюдаемый возврат внутри оператора switchMap, например так:

    this.deactivate$
        .pipe(
            switchMap(() => {
               if (canDeactivate) {
                   return Observable.of(canDeactivate);
               }
               else {
                   return Observable.of(window.confirm("message"));
               }
            })
        );

Бонус (супер короткая версия):

this.deactivate$.pipe(
        switchMap((canDeactivate) => Observable.of(canDeactivate || window.confirm("message"))
    );

Надеюсь, это поможет!

2 голосов
/ 04 июня 2019

Из документации по rxjs

iif При подписке решает, какой Observable будет на самом деле подписался.

iif принимает условную функцию и две наблюдаемые. Когда Наблюдаемое, возвращаемое оператором, подписано, условная функция будет называться. Основываясь на том, что логическое значение возвращается в тот момент, потребитель подпишется либо на первое наблюдаемое (если условие было верно) или ко второму (если условие было ложным). Состояние функция также может ничего не возвращать - в этом случае условие будет оценивается как ложное и вторая Наблюдаемая будет подписана.

пример

let accessGranted;
const observableIfYouHaveAccess = iif(
  () => accessGranted,
  of('It seems you have an access...'),
  of('Opps')
);

Таким образом, если accessGranted имеет значение true, он выполнит первую из секунд секунды

0 голосов
/ 04 июня 2019

window.confirm означает блокирование , поэтому вы можете просто использовать оператор map(). Вызов switchMap для of(window.confirm(..)) просто остановит выполнение JavaScript в любом случае.

this.deactivate$
    .pipe(
        map(canDeactivate => canDeactivate ? canDeactivate : window.confirm("message"))
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...