RxJS:如何在过时时忽略流中的项目

时间:2018-04-14 13:58:02

标签: rxjs reactive-programming rxjs5 reactive

我正在尝试订阅一个返回布尔值的“加载”Observable。如果加载为true,则目标是对流中的项进行延迟,但如果加载为false则不延迟。也应该可以忽略过时的项目,让我们假设以下情况:

在流中有两个项目:

  • 项目A,其值为true,并立即传递
  • 项目B,其值为false,并在200分钟后通过

项目A的值为true,因为它将延迟500ms,项目B不会延迟。在这种情况下,项目B将在项目A之前到达。我正在寻找一个完全忽略上述案例的项目A的解决方案。

在这里,您可以看到我目前尚未解决的问题:

this.loading$
        .pipe(
            distinctUntilChanged(),
            delayWhen(loading => timer(loading ? 500 : 0))
        )
        .subscribe(loading => {
            // Do something
        });

1 个答案:

答案 0 :(得分:1)

只需将delayWhen替换为switchMap即可。 switchMap可以取消过时的内部流。你可能是一次性的可观察而不是计时器:

this.loading$
        .pipe(
            distinctUntilChanged(),
            switchMap(
               loading => 
                           of(loading).pipe(delay(loading ? 500 : 0)))
        )
        .subscribe(loading => {
            // Do something
        });