Angular http以增加的间隔

时间:2017-11-21 16:13:18

标签: angular rxjs

我正在创建一个Angular应用程序,它将定期轮询后端API。我想保持页面上的数据与后端的信息保持同步,以防它在前端独立于用户的操作而发生变化。

当用户在页面上完成操作时,它将启动轮询。最初,该操作返回具有项的新状态的对象。但是,在完成该操作后不久,对象的状态可能会在后端发生变化。随着时间的推移,对象的状态在没有用户交互的情况下发生变化的可能性会下降。

我想实现对每个后续调用使用递增超时的轮询,以模拟对象的预期行为并减少后端资源的压力。

例如:

  • 初次通话,等待1秒
  • 重复通话,等待2秒
  • 重复通话,等待4秒
  • 重复通话,等待8秒
  • 重复通话,等待16秒

我见过articles描述了如何在RxJS中使用Observables设置polling,但它们似乎都使用静态超时(即在调用之间总是等待5秒)。

如何定期,间隔地增加Angular中的HTTP调用?

2 个答案:

答案 0 :(得分:4)

虽然我确信总有一些更好的方法 - 为了代码的可读性,我会选择以下内容。



function callWithIncreasingInterval() {
  var count = 1;
  return Rx.Observable.of(true)
      .delayWhen(() => Rx.Observable.timer(Math.pow(2, count)))
      .switchMap(() => someRestCall())
      .do(() => ++count)
      .repeat();
}

function someRestCall() {
    return Rx.Observable.of("some rnd " + Math.random()).delay(50);
}

callWithIncreasingInterval()
  .subscribe(result => console.log(result));

<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
&#13;
&#13;
&#13;

但是作为一般性说明:对于像这样的问题,应该考虑websockets,它是2017年; - )

答案 1 :(得分:1)

@olsn解决方案非常好,但这是一个递归的解决方案。它也更通用了。

顺便说一下。注意延迟的指数增长 - 可能你不想让它在没有任何限制的情况下增加。

&#13;
&#13;
const repeatableAction = (action, when = 1000, nextWhen = current => current * 2) =>
  Rx.Observable.timer(when)
  .mergeMapTo(action
    .concat(Rx.Observable.defer(() =>
      repeatableAction(action, nextWhen(when), nextWhen)))
  )

let start = Date.now()
repeatableAction(Rx.Observable.of('ACTION'))
  .do(x => console.log(x, (Date.now() - start) / 1000))
  .subscribe()
&#13;
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
&#13;
&#13;
&#13;