RXJS-等待直到两个可观察值都完成

时间:2019-10-25 21:32:07

标签: angular rxjs rxjs6

我是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。

1 个答案:

答案 0 :(得分:2)

我设法使用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。