javascript - 带暂停和恢复轮询的 Rxjs 计时器

标签 javascript angular typescript rxjs rxjs6

我有一个服务HomeService并且在服务中有这个方法

getAlerts(): Observable<any> {
    return this.apiService.post(`${this.DASHBOARD_URL}/alerts`);
}

所以我有一个场景,我必须每 10 秒轮询一次此方法才能获取新数据,并且轮询应该仅在成功响应和浏览器选项卡处于事件状态时发生。当浏览器选项卡处于非事件状态时,轮询应暂停并在选项卡处于事件状态时恢复。

从我正在执行此操作的组件:

import {Subscription, timer as observableTimer} from 'rxjs';
import {delay, retryWhen, takeWhile} from 'rxjs/operators';

    private pollAlerts(): void {
             this.pollAlertsRequest = this.homeService.getAlerts().pipe(retryWhen(errors => errors.pipe(delay(10 * 1000))))
              .subscribe(res => {
                this.populateAlerts(res.alerts);
                this.alertsTimer = observableTimer(10 * 1000).pipe(
                  takeWhile(() => this.isComponentAlive))
                  .subscribe(() => {
                    this.pollAlerts();
                  });
              });
    }

我能够完成计时器,但不知道如何暂停和恢复。

最佳答案

takeWhile更改为过滤器

private pollAlerts(): void {
             this.pollAlertsRequest = this.homeService.getAlerts().pipe(retryWhen(errors => errors.pipe(delay(10 * 1000))))
              .subscribe(res => {
                this.populateAlerts(res.alerts);
                this.alertsTimer = observableTimer(10 * 1000).pipe(
                  filter(() => this.isComponentAlive)),
                  switchMap(()=>interval(1000)),
                     tap(()=>this.pollAlerts());
                 ).subscribe();
              });

关于javascript - 带暂停和恢复轮询的 Rxjs 计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53163108/

相关文章:

javascript - 如何在不输入完整比较的情况下添加石头剪刀布的无限变化

Javascript:在 DOM 中插入新级别

javascript - 即使在将数字显式转换为字符串变量后,Angular 仍然编译没有错误

javascript - ngModel 强制获取属性两次

node.js - Elasticsearch 返回类型

javascript - 'new' 表达式,其目标在 TypeScript 中缺少构造签名

javascript - Fabric js免费绘制矩形结果重复

javascript - 在哪个对象上调用 .addToUI

javascript - 如果 observable 使用异步管道是错误的,则 Angular 显示模板

javascript - Angular router.navigate with/route guard 已经在组件上时不起作用