【问题标题】:Delay observable flow while BehaviorSubject value === false在 BehaviorSubject 值 === false 时延迟可观察流
【发布时间】:2018-08-28 11:18:22
【问题描述】:

我有一个应用程序每 2 秒执行一次 HTTP 请求并更新视图。问题是,我必须做一些用户触发的 CSS 动画,这些动画大约需要一秒钟,而且经常会因为 Angular 在动画运行时更新 DOM 而损坏。

我正在使用 Akita 存储并像这样检索 observables:

this.dosingVessels$ = this.dosingVesselsQuery.selectAll().pipe(*needs rxjs operator magic*);

然后像这样在组件中显示它们:

    <app-solving-vessel *ngFor="let vessel of solvingVessels$ | async"
                    [vessel]="vessel"
                    [ngClass]="{'animation-class': hoverId === vessel.id}">
    </app-solving-vessel>

如何在动画进行时实现这一点:

animate(event, vessel) {
    this.updateView.next(false); // prevent from updating
    this.hoverId = vessel.id; // triggers animation
    timer(1000).subscribe(tick => this.updateView.next(true)); // allow normal updating
}

视图没有更新。

我发现了 delayWhen 运算符,但所有示例都带有计时器,我不确定它是否是正确的方法。

【问题讨论】:

    标签: angular rxjs angular6 akita angular-akita


    【解决方案1】:

    debounce 是否支持您的需求?您可以将 Observable 传递给它,并且您的链将等到该 Observable 发出后再继续。如果您需要它等待特定的值,您还需要使用filter 运算符。

    我不确定在您的代码中的确切位置,但它可能看起来像这样:

    this.dosingVesselsQuery.selectAll().pipe(
        debounce(() => 
            this.updateView
                .pipe(filter(val => val == true))
                .pipe(first())));
    

    编辑:

    看来debounce 会更好地支持您的需求。我已经相应地编辑了我的帖子。

    【讨论】:

    • 干杯,您的解决方案按我需要的方式工作。由于我的 SO 分数低,无法给您公开 +1,但非常感谢您的贡献!谢谢! :)
    【解决方案2】:

    延迟可观察订阅或延迟可观察本身是帮助您访问this链接的方法,这基本上表明延迟发生在绝对时间。所以,基本上,您的代码应该是这样的

    this.dosingVessels$ = this.dosingVesselsQuery.selectAll().pipe(delaySubscription(1000));
    

    this.dosingVessels$ = this.dosingVesselsQuery.selectAll().pipe(delay(1000));
    

    【讨论】:

    • 我认为这对我没有帮助。可以说,我在 0 时获取数据。然后在 1.5 秒时,用户与页面交互并导致动画运行。在这种情况下,我必须等待 500 毫秒才能更新页面……但是如果用户在 1.3 秒或 1.9 秒时与页面交互怎么办?那我的间隔就不能一样了?
    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2017-07-13
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多