首页 > 解决方案 > RXJS - 等到两个 observables 都完成

问题描述

我是 RXJS 的新手,我正在编写一个验证函数,其中可能会弹出 2 个模态(一个接一个),用户必须确认他们可以打破验证规则。

我这样称呼它:

this.isValidAssignment(x,y,z).subscribe(result => {
    if (!result) { return; }
    ...do something...
});
isValidAssignment(x, y, z): Observable<boolean> {
      if (x === y){
          of(false)
      }
      if (x < y) {
          return this.confirmIncorrectAssignment();
      }
      if (y !== z) {
          return this.confirmIncorrectAssignment();
      }

      return of(true)
  }

// returns true if they click yes and false if they click no
confirmIncorrectAssignment(): Observable<boolean> {
    const dialogRef = this.dialog.open(ConfirmCancelModalComponent);

    return dialogRef.afterClosed();
  }

我的问题是,如果第一次确认执行它会继续并返回一个 Observable 并且第二次验证永远不会被检查。

RXJS 中确保用户确认两种模式的最佳方法是什么?我只希望它在两个可观察对象都已完成并且它们都单击“是”时发出 true 。

标签: angularrxjsrxjs6

解决方案


我设法使用 RXJS forkJoin 和 map 运算符找到了解决方案。我更新的代码如下所示。

isValidAssignment(x, y, z): Observable<boolean> {
    let o1: Observable<boolean> = of(true);
    let o2: Observable<boolean> = of(true);
      if (x === y){
          return of(false)
      }
      if (x < y) {
          o1 = this.confirmIncorrectAssignment();
      }
      if (y !== z) {
          o2 = this.confirmIncorrectAssignment();
      }

      return forkJoin([o1, o2]).pipe(map((x) => x[0] && x[1]));
  }

因为我将 observable 初始化为 true,如果没有另外分配给模态的返回,它将发出 true。假设两个验证都被触发,一旦它们都完成,forkJoin 会将其通过管道传输到地图中,然后使用布尔逻辑返回 true 或 false。


推荐阅读