Angular RxJS:条件运算符(如果其他)

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)

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

有任何想法吗?

Llo*_*iol 9

您可以决定在 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)

  • 当然,如果你想要更短,怎么样: Observable.of(canDeactivate || window.confirm("message")) :) (2认同)

Ton*_*Ngo 8

来自 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 中的第一个

  • iif() 没有解决 @Jordi 想要实现的目标...我的意思是,这个例子仅显示 iif() 背后的理论,而不是解决方案。他有一个输入流,他如何将'this.deactivate$'与iif()合并?另外,如果合并到 switchMap 内部,则与 if/else 相同。 (2认同)