【问题标题】:CombineLatest, execute only once after all observables are completeCombineLatest,在所有 observables 完成后只执行一次
【发布时间】:2021-10-22 03:16:25
【问题描述】:

我正在尝试解决一个问题。目前,我正在打开一个模式,但为此我需要 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

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

【问题讨论】:

    标签: angular typescript combinelatest


    【解决方案1】:

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

    【讨论】:

    • 由于我的项目的复杂性非常高,我不能使用 forkJoin 因为它会进行巨大的重构,因为如果我使用它,它会破坏很多代码,这就是我问的原因对于仅使用 combineLatest 的解决方案。
    • 查看回复。我的第二个答案不太优雅,但应该可以工作,并且只打开一次模式。
    • 你不也添加一个take(1),只是为了确定吗?
    • 您也可以添加一个 take(1)。好主意。
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2021-12-22
    • 2018-09-23
    • 2022-01-10
    相关资源
    最近更新 更多