Angular RxJS:条件运算符(如果不是)

时间:2019-06-04 15:08:56

标签: angular typescript rxjs

我试图弄清楚如何将简单的条件操作实现为可观察的。

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

我想要得到的是:

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

上面第一个代码的问题是,当我过滤发射值时,其余的运算符未执行,并且流停止填充发射值。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

来自rxjs的文档

  

iif决定在订阅时哪个Observable实际上是   已订阅。

     

iif接受条件函数和两个Observable。当一个   操作员返回的可观察值已订阅,条件函数   将被称为。根据当时返回的布尔值,   消费者将订阅第一个可观察者(如果有条件   是true)或秒数(如果条件为false)。条件   函数也可能不返回任何内容-在这种情况下   评估为false,第二个Observable将被订阅。

示例

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

因此,如果accessGranted为true,它将执行第二个中的第一个

答案 1 :(得分:2)

您可以像下面这样决定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 :(得分:0)

window.confirm阻止,因此您可以只使用map()运算符。无论如何,将switchMap调用到of(window.confirm(..))只会停止执行JavaScript。

this.deactivate$
    .pipe(
        map(canDeactivate => canDeactivate ? canDeactivate : window.confirm("message"))
    );