Jor*_*rdi 9 javascript rxjs single-page-application typescript angular
我试图弄清楚如何将一个简单的条件操作实现为一个可观察的对象。
this.deactivate$
.pipe(
filter((canDeactivate) => !canDeactivate),
switchMap(() => Observable.of(window.confirm("message")))
);
Run Code Online (Sandbox Code Playgroud)
我想得到的是:
if (canDeactivate) {
return canDeactivate;
}
else {
return window.confirm("message");
}
Run Code Online (Sandbox Code Playgroud)
上面代码的第一个问题是,当我过滤发出的值时,不执行其余的运算符,并且流停止填充发出的值。
有任何想法吗?
您可以决定在 switchMap 运算符中返回哪个 observable ,如下所示:
this.deactivate$
.pipe(
switchMap((canDeactivate) => {
if (canDeactivate) {
return Observable.of(canDeactivate);
}
else {
return Observable.of(window.confirm("message"));
}
})
);
Run Code Online (Sandbox Code Playgroud)
奖励(超短版):
this.deactivate$.pipe(
switchMap((canDeactivate) => Observable.of(canDeactivate || window.confirm("message"))
);
Run Code Online (Sandbox Code Playgroud)
来自 rxjs 的文档
iif 在订阅时决定实际订阅哪个 Observable。
iif 接受一个条件函数和两个 Observable。当订阅了操作符返回的 Observable 时,将调用条件函数。根据当时返回的布尔值,消费者将订阅第一个 Observable(如果条件为真)或第二个(如果条件为假)。条件函数也可能不返回任何内容 - 在这种情况下,条件将被评估为 false,第二个 Observable 将被订阅。
例子
let accessGranted;
const observableIfYouHaveAccess = iif(
() => accessGranted,
of('It seems you have an access...'),
of('Opps')
);
Run Code Online (Sandbox Code Playgroud)
因此,如果 accessGranted 为真,它将执行 else 中的第一个
| 归档时间: |
|
| 查看次数: |
14365 次 |
| 最近记录: |