Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度RxJS:条件运算符(如果其他)_Javascript_Angular_Typescript_Rxjs_Single Page Application - Fatal编程技术网

Javascript 角度RxJS:条件运算符(如果其他)

Javascript 角度RxJS:条件运算符(如果其他),javascript,angular,typescript,rxjs,single-page-application,Javascript,Angular,Typescript,Rxjs,Single Page Application,我试图弄清楚如何将一个简单的条件运算实现到一个可观察的对象中 this.deactivate$ .pipe( filter((canDeactivate) => !canDeactivate), switchMap(() => Observable.of(window.confirm("message"))) ); 我想得到的是: if (canDeactivate) { return canDeactivate; } els

我试图弄清楚如何将一个简单的条件运算实现到一个可观察的对象中

this.deactivate$
    .pipe(
        filter((canDeactivate) => !canDeactivate),
        switchMap(() => Observable.of(window.confirm("message")))
    );
我想得到的是:

if (canDeactivate) {
    return canDeactivate;
}
else {
    return window.confirm("message");
}
上面第一段代码的问题是,当我过滤发出的值时,其余的操作符不会执行,流停止以填充发出的值


有什么想法吗?

来自rxjs的文档

iif在订阅时决定哪一个可观察到的 订阅

iif接受一个条件函数和两个观察值。当 运算符返回的可观测值已订阅,条件函数 将被调用。基于此时返回的布尔值, 消费者将订阅第一个可观察到的(如果条件 是true)或第二个(如果条件为false)。条件 函数也可能不返回任何内容-在这种情况下,条件将为 评估为错误,将订阅第二个可观察项

范例

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

因此,如果accessgrated为true,它将执行else second中的第一个,您可以在switchMap操作符中决定哪个可观察的返回,如下所示:

    this.deactivate$
        .pipe(
            switchMap((canDeactivate) => {
               if (canDeactivate) {
                   return Observable.of(canDeactivate);
               }
               else {
                   return Observable.of(window.confirm("message"));
               }
            })
        );
奖金(超短版):


窗口。确认
处于阻塞状态,因此您可以使用
map()
操作符。调用switchMap到(window.confirm(..)的
,将停止JavaScript的执行

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

还是更短,更坦率?可观察的(canDeactivate):可观察的(窗口确认(“消息”);当然,如果你想的话,可以缩短一些,那么:Observable.of(canDeactivate | | window.confirm(“message”):)iif()无法解决@Jordi想要实现的问题。。。我的意思是,这个例子只展示了iif()背后的理论,而不是解决方案。他有一个输入流,如何将“this.deactivate$”与iif()合并?此外,如果合并到switchMap中,它将与if/else相同。
this.deactivate$
    .pipe(
        map(canDeactivate => canDeactivate ? canDeactivate : window.confirm("message"))
    );