加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用Angular 2中的rxjs按间隔请求异步

发布时间:2020-12-17 17:02:29 所属栏目:安全 来源:网络整理
导读:我想使用rxjs在http请求中设置间隔.我需要在请求完成后n秒内在服务器上发送数据. Observable.interval(10000) .?(() = { //request for server. return Observable return this.getData(); }) .subscribe(() = { console.log("Request done. After 10 second
我想使用rxjs在http请求中设置间隔.我需要在请求完成后n秒内在服务器上发送数据.

Observable.interval(10000)
                  .?(() => {
                      //request for server. return Observable
                      return this.getData();
                  })
                  .subscribe(() => {
                      console.log("Request done. After 10 second will be next request");
                  });

UPDATE基于Mark建议的.expand()

ngOnInit() {
  this.getData()
    .expand(() => Rx.Observable.timer(10 * 1000)
      .concatMap(() => this.getData())
    )
    .subscribe(data => {
      console.log('received new data',data);
    });
}

private getData() {
  return Observable.timer(5000)
    .do(() => console.log("timer"));
}

解决方法

您的usecase是.expand运算符的一个很好的例子,它可以递归地执行和返回新值.请参阅此片段,其中我添加了大量时间戳调试日志记录以阐明正在进行的操作.

function getData() {
  // simulate remote call which can take some time
  return Rx.Observable.of('')
    .timestamp()
    .do(i => console.log(`[debug] Going to fetch data from server @${i.timestamp}`))
    .map(i => 'the new JSON blob of data to use') // this would be your actual http.get call
    .delay(1500)
    .timestamp()
    .do(i => console.log(`[debug] Data retreived from server @${i.timestamp}`));
}

getData()
  .expand(_ => Rx.Observable.of('') // we need something to delay upon
    .timestamp()
    .do(i => console.log(`[debug] Waiting 1sec for next getData ${i.timestamp}`))
    .delay(1000)
    .concatMap(() => getData())
  )
  .take(5)
  .subscribe(val => console.log(`New data received @${val.timestamp} : ${val.value}`))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>

所以最初你订阅了getData()并扩展它的值,以便在检索下一个getData()之前递归延迟一段时间.此方法不涉及任何主题,您的订阅仍可用于接收新值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读