RxJS:过时时如何忽略流中的项目
RxJS: How to ignore item in stream when outdated
我正在尝试订阅一个 "loading" Observable,它是一个 returns 布尔值。目标是在加载为真时延迟流中的项目,但在加载为假时则不会。也应该可以忽略过时的项目,让我们假设以下情况:
流中有两项:
- 项目 A 的值为 true,并立即通过
- 项目 B 的值为 false,并在 200 毫秒后传递
item A 的值为true,因为它会延迟500ms,item B 不会延迟。在这种情况下,项目 B 将在项目 A 之前到达。对于上述情况,我正在寻找完全忽略项目 A 的解决方案。
在这里你可以看到我当前的无效解决方案:
this.loading$
.pipe(
distinctUntilChanged(),
delayWhen(loading => timer(loading ? 500 : 0))
)
.subscribe(loading => {
// Do something
});
只需将 delayWhen
替换为 switchMap
即可。 switchMap
可以取消过时的内部流。而且您可能是一次性可观察对象而不是计时器:
this.loading$
.pipe(
distinctUntilChanged(),
switchMap(
loading =>
of(loading).pipe(delay(loading ? 500 : 0)))
)
.subscribe(loading => {
// Do something
});
我正在尝试订阅一个 "loading" Observable,它是一个 returns 布尔值。目标是在加载为真时延迟流中的项目,但在加载为假时则不会。也应该可以忽略过时的项目,让我们假设以下情况:
流中有两项:
- 项目 A 的值为 true,并立即通过
- 项目 B 的值为 false,并在 200 毫秒后传递
item A 的值为true,因为它会延迟500ms,item B 不会延迟。在这种情况下,项目 B 将在项目 A 之前到达。对于上述情况,我正在寻找完全忽略项目 A 的解决方案。
在这里你可以看到我当前的无效解决方案:
this.loading$
.pipe(
distinctUntilChanged(),
delayWhen(loading => timer(loading ? 500 : 0))
)
.subscribe(loading => {
// Do something
});
只需将 delayWhen
替换为 switchMap
即可。 switchMap
可以取消过时的内部流。而且您可能是一次性可观察对象而不是计时器:
this.loading$
.pipe(
distinctUntilChanged(),
switchMap(
loading =>
of(loading).pipe(delay(loading ? 500 : 0)))
)
.subscribe(loading => {
// Do something
});