rxjs:定期执行一些操作,中间有特定的延迟

2024-04-21

客户端应用程序向服务器发送请求,这可能需要很长时间才能完成。一旦请求完成或失败,客户端应该等待一段时间(即10秒)然后再次发送请求。

目前的工作解决方案是这样的:

appRequest = new Subject();

ngOnInit(): void {
  this.appRequest.delay(10000).subscribe(() => this.refresh());
  this.refresh();
}

refresh() {
  this.api.getApplications().subscribe(a => {
      this.updateApplications(a);
      this.appRequest.next();
    },() => this.appRequest.next()
  );
}

有没有更优雅的解决方案?

EDIT:

我可以定期使用计时器,但我不想发送新的请求,除非先前的请求已完成。只有在上一个请求完成后,我想等待 10 秒,然后再次发送请求。这应该无限期地重复。

getApplications()函数是由 swagger 生成的,它内部使用 Angular 的 http 客户端库。目前的观察是,除非您订阅Observable由返回getApplications(),它不会向服务器发送请求。


The repeatWhen()运算符似乎是为此设计的,但是 rxjs 风格中缺乏示例和文档。

这是 RxJava 的文档(描述也适用于 RxJs)RxJava的repeatWhen和retryWhen,解释 http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/.

Uses
使用repeatWhen+delay定期轮询数据:
source.repeatWhen(completed => completed.delay(5000))

您的版本可能是

stopRequesting = new Subject();

ngOnInit() {
  this.api.getApplications()
    .repeatWhen(completed => completed.delay(10000))
    .takeUntil(stopRequesting)
    .subscribe(a => this.updateApplications(a))
} 

ngOnDestroy() {
  this.stopRequesting.next(true);
}

Demo

// log to html output
log = function(x) { document.write(x + "<br />"); };

const stop = new Rx.Subject();

Rx.Observable.interval(500)
  .take(2)
  .repeatWhen(completed => completed.delay(1000))
  .takeUntil(stop)
  .subscribe(
    x => log(`Next: ${x}`),
    err => log(`Error: ${err}`),
    () => log('Completed')
  );

setTimeout(() => stop.next(true), 10000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rxjs:定期执行一些操作,中间有特定的延迟 的相关文章

随机推荐

  • 当 props 改变时,以下策略中哪一个是重置组件状态的最佳方法

    我有一个非常简单的组件 带有文本字段和按钮 它接受一个列表作为输入 并允许用户循环浏览该列表 该组件有以下代码 import as React from react import Button from material ui core i
  • 如何在传递给命令行参数时转义 Bash 中的变量

    我有一个 Bash 脚本 Cygwin 它使用一些带有空格的 Windows 路径 因此 我逃离了这个空间 在我的变量定义中 脚本中的所有内容都运行良好 但是 我需要将此变量作为参数传递给命令行可执行文件 当我这样做时 我的逃跑就会变得一团
  • SED 或 AWK 将所有内容替换为另一个文件中的模式

    我正在尝试使用 SED 脚本进行模式替换 但它无法正常工作 样本内容 txt 288Y2RZDBPX1000000001dhana JP2F64EI1000000002d EU9V3IXI1000000003dfg1000000001dfd
  • 使用 NSArrayController 过滤单列 NSTableView

    我展示了一张带有NSTableView 一栏 一个NSSearchField and an NSButton 添加 我想要的是将表视图的内容设置为字符串列表 该字符串列表位于NSArray called list 应根据搜索字段的内容过滤此
  • 如何在 Google Ads api 中设置请求标头

    我想为我的经理帐户下的广告帐户提出预算 我有以下 YAML 文件 developer token 13245 login customer id 1324567891 customer id 1324567891 user agent 13
  • 为 v-html 添加 CSS 样式

    我想在 HTML 代码中添加样式v html 我尝试了几种解决方案 但没有任何功能 这是我的代码 模板 div class para div 脚本 export default data return value h2 TITLE h2 p
  • Android模拟器平台4.0启动问题

    我刚刚迁移到冰淇淋三明治模拟器 4 0 启动它时遇到很多困难 有时我收到数据库连接存在错误 并且无法启动 然后出现线程 52 违规之类的情况 现在模拟器已加载 但当我尝试解锁它时 我收到一些策略违规错误 然后它冻结了 我真的很沮丧 其他人也
  • UISearchBar - ReturnKeyType 不适用于 iOS 8

    我在用UISearchbar在故事板的表视图控制器中 和搜索栏returnKeyType is UIReturnKeySearch 它在 iOS7 上运行良好 但是returnKeyType不适用于 iOS8 在iOS8中 键盘上每次都会出
  • 无法使用 junit 测试异常

    我有一个包含 try catch 块的方法 但我不知道如何使我的测试通过 这是我的代码 public class ClassToTest public void loadFileContent try InputStream fileStr
  • 在 IIS7 中使用 WAS 时,global.asax Application_Start 等效项是什么

    我想对当前托管在 IIS7 中的 WCF 应用程序使用 netTcpBinding 这意味着将其配置为使用 WAS 这相当简单 但是 我的应用程序之前使用了 global asax 文件中的 Application Start 事件 我不需
  • 使用嵌套数组过滤对象数组

    所以我试图在对象数组上设置嵌套过滤器 问题是过滤器应用在对象内部的另一个对象数组的键上 这是代码 const items name 123 id 1 value true arr id 1 name 456 id 2 value false
  • iOS 7 错误警告:在演示或关闭正在进行时尝试从视图控制器 关闭

    我在 iOS 7 中遇到了 iOS 6 中未出现的问题 我有一个导航控制器 它显示另一个导航控制器来添加员工 第二个控制器以模态方式呈现 当我使用 取消 或 完成 按钮关闭第二个控制器时 出现错误 这是错误 QuickSchedule 88
  • 检查 LocalDateTime 是否在时间范围内

    我的时间 A 应该在时间 B 的 90 分钟范围内 之前和之后 示例 时间为 4 00 pm 时间 A 应介于 2 30 pm 90 到 5 30 pm 90 之间 尝试了以下方法 if timeA isAfter timeB minusM
  • 只允许在 Codeigniter 中看到路由中指定的 URL

    如果我有一个名为articles的控制器 它有一个名为view articles的方法 用户可以输入http example com articles view articles some post http example com art
  • python - 使用selenium在页面上查找电子邮件地址

    我正在尝试从网站获取电子邮件地址列表 并且非常接近 我的代码如下所示 我收到以下错误 发生的情况是 有一个链接页面 然后单击该链接 在下一页中有一个电子邮件地址 单击链接后 我试图打印每个页面内的电子邮件地址 这是链接点击进入的页面示例 h
  • 如何取消或停止客户端的推送通知?

    我有一个向客户端发送推送通知的网络服务器 客户端可以拦截推送通知UNNotificationServiceExtension在 iOS 10 上并更改内容 现在我想取消在某些通知上在客户端显示的推送通知 我怎么做 我尝试做 self con
  • 两个连续 KeyDown 事件之间的延迟较长

    我正在编写一个小游戏引擎 纯粹是为了从内部了解它们是如何工作的 我目前不想搞乱 OpenGL 或 DirectX 所以我坚持使用 GDI 和所有 WinForms 东西在控件上绘图 显然 我需要处理输入 更具体地说 是键盘事件 然而 这带来
  • WIX 合并 C++ 运行时

    我已经合并了 msm 与 2015 crt
  • Scikit - 如何定义绘制 roc 曲线的阈值

    我有一个增强树模型以及测试数据集的概率和分类 我正在尝试绘制相同的 roc curve 但我无法弄清楚如何在 scikit learn 中定义 roc 曲线的阈值 alpha from sklearn metrics import prec
  • rxjs:定期执行一些操作,中间有特定的延迟

    客户端应用程序向服务器发送请求 这可能需要很长时间才能完成 一旦请求完成或失败 客户端应该等待一段时间 即10秒 然后再次发送请求 目前的工作解决方案是这样的 appRequest new Subject ngOnInit void thi