CombineLatest,仅在所有可观察对象完成后执行一次

CombineLatest, execute only once after all observables are complete

我正在尝试解决一个问题。目前,我正在打开一个模式,但为此我需要 3 条路线 observables 的组合。所以,我的代码逻辑是这样的:

combineLatest([obs1, obs2, obs3])
    .subscribe(([s1, s2, s3]: any) => { 
        openModal();
    });

因为它将被执行 3 次,我的模式也将被打开 3 次,但我不希望它这样做,但我知道这是预期的行为。

因此,为此,我实施的糟糕的解决方案使用的是 flag,如下所示:

let shouldOpen = true;

combineLatest([obs1, obs2, obs3])
    .subscribe(([s1, s2, s3]: any) => { 
        if(shouldOpen) {
            shouldOpen = false;
            openModal();
        }
    });

当然,这不是一个好的解决方案。

所以,问题 是,有没有办法让我继续使用 combineLatest 但只执行一次 ?

如果您想尝试使用 combineLatest,这里是 Stackblitz

Note: I cannot use forkJoin or zip, I already tried those.

因为你不能使用 forkJoin(这是正确的答案),跳过 combineLatest

的前两个排放
combineLatest([obs1, obs2, obs3])
  .pipe(skip(2))
  .subscribe(([s1, s2, s3]: any) => { 
    openModal();
  });

您也可以使用 skipWhile 跳过,直到所有三个都被定义:

      .pipe(skipWhile(([s1, s2, s3]) => s1===undefined || s2 === undefined || s3===undefined))