我试图弄清楚如何将简单的条件操作实现为可观察的。
this.deactivate$
.pipe(
filter((canDeactivate) => !canDeactivate),
switchMap(() => Observable.of(window.confirm("message")))
);
我想要得到的是:
if (canDeactivate) {
return canDeactivate;
}
else {
return window.confirm("message");
}
上面第一个代码的问题是,当我过滤发射值时,其余的运算符未执行,并且流停止填充发射值。
有什么想法吗?
答案 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"))
);