我正在创建一个Angular应用程序,它将定期轮询后端API。我想保持页面上的数据与后端的信息保持同步,以防它在前端独立于用户的操作而发生变化。
当用户在页面上完成操作时,它将启动轮询。最初,该操作返回具有项的新状态的对象。但是,在完成该操作后不久,对象的状态可能会在后端发生变化。随着时间的推移,对象的状态在没有用户交互的情况下发生变化的可能性会下降。
我想实现对每个后续调用使用递增超时的轮询,以模拟对象的预期行为并减少后端资源的压力。
例如:
我见过articles描述了如何在RxJS中使用Observables设置polling,但它们似乎都使用静态超时(即在调用之间总是等待5秒)。
如何定期,间隔地增加Angular中的HTTP调用?
答案 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;
但是作为一般性说明:对于像这样的问题,应该考虑websockets,它是2017年; - )
答案 1 :(得分:1)
@olsn解决方案非常好,但这是一个递归的解决方案。它也更通用了。
顺便说一下。注意延迟的指数增长 - 可能你不想让它在没有任何限制的情况下增加。
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;