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

RxJS:过期时如何忽略流中的项,rxjs,reactive-programming,rxjs5,reactive,Rxjs,Reactive Programming,Rxjs5,Reactive,我试图订阅一个“加载”的可观察对象,它返回一个布尔值。目标是,如果加载为true,则流中的项会有延迟,但如果加载为false,则不会有延迟。也可以忽略过时的项目,假设以下情况: 流中有两项: 值为true的项,并立即传递 值为false的项目B,并在200毫秒后通过 项目A的值为真,因为它将延迟500毫秒,项目B将不会延迟。在这种情况下,B项将在A项之前到达。我正在寻找一种解决方案,以便在上述情况下完全忽略A项 在这里,您可以看到我当前的无效解决方案: this.loading$

我试图订阅一个“加载”的可观察对象,它返回一个布尔值。目标是,如果加载为true,则流中的项会有延迟,但如果加载为false,则不会有延迟。也可以忽略过时的项目,假设以下情况:

流中有两项:

  • 值为true的项,并立即传递
  • 值为false的项目B,并在200毫秒后通过
项目A的值为真,因为它将延迟500毫秒,项目B将不会延迟。在这种情况下,B项将在A项之前到达。我正在寻找一种解决方案,以便在上述情况下完全忽略A项

在这里,您可以看到我当前的无效解决方案:

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

只要将
delayWhen
替换为
switchMap
就可以了<代码>开关映射可以取消过期的内部流。您可能是一次性可观察到的,而不是计时器:

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

只要将
delayWhen
替换为
switchMap
就可以了<代码>开关映射可以取消过期的内部流。您可能是一次性可观察到的,而不是计时器:

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

您首先说“项目A的值为true,并立即传递”,然后在下一句中说“项目A的值为true,因此将延迟500毫秒”。。。我很困惑。项目A在流中排在第一位,但由于500毫秒的延迟(请参阅delayWhen->timer(500)),项目B将更快到达(因为它没有延迟->delayWhen->timer(0)),在这种情况下,我想忽略项目A,您首先说“项目A的值为true,并且立即传递”,然后在下一句中“项目A的值为true,因为它将延迟500毫秒”…我感到困惑。项目A在流中首先出现,但由于延迟500毫秒(请参阅delayWhen->timer(500)),项目B将更快到达(因为它没有延迟->delayWhen->timer(0)),在这种情况下,我想忽略项目A