首页 > 解决方案 > CombineLatest,在所有 observables 完成后只执行一次

问题描述

我正在尝试解决一个问题。目前,我正在打开一个模式,但我需要为此结合 3 个路由可观察对象。所以,我的代码逻辑是这样的:

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 。

注意:我不能使用forkJoinor zip,我已经尝试过了。

标签: angulartypescriptcombinelatest

解决方案


由于您不能使用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))

推荐阅读