RxJS interval() 在 MS Edge 中变化很大

RxJS interval() varies wildly in MS Edge

我有一个 Angular 6 应用程序,它每 10 秒执行一次 API 调用以更新报价。 API 调用的时间是使用 RxJS interval() 管理的。

出于某种原因,在 MS Edge 上,时间变化很大,从几秒到几分钟不等。任何想法可能是什么原因?

代码如下:

const refreshPriceInterval = interval(10000);
let startTime = new Date(), endTime: Date;

refreshPriceInterval.pipe(
        startWith(0),
        flatMap(() => {
            endTime = new Date();
            let timeDiff = endTime.getTime() - startTime.getTime(); //in ms
            // strip the ms
            timeDiff /= 1000;
            console.log(timeDiff);
            startTime = new Date();
            return this.timeseriesService.getQuote(symbol, this.userInfo.apiLanguage);
        })
)

控制台输出如下:

0.001
18.143
4.111
11.057
13.633
12.895
3.003
12.394
7.336
31.616
20.221
10.461

有没有办法提高准确率?

编辑:

性能会随着时间的推移而下降。

将 interval() 中的代码减少到只有一个 console.log 并没有表现得更好。

可能是 Angular 问题。

由浏览器决定为每个浏览器选项卡分配多少 CPU 个循环。根据资源(例如;电池)或 activity(背景选项卡与前景选项卡),您的浏览器页面将收到或多或少的 cpu 切片。

一些背景:https://github.com/WICG/interventions/issues/5

This is shipped in Edge as well now (as of EdgeHTML14). The clamping to 1Hz in background tabs, not anything more intensive.

除此之外;您也在测量通话的延迟时间: timeseriesService.getQuote() 所以也可能是这个调用需要一些时间。

这确实是一个 Angular 问题。定时进程导致 Angular 不断重新呈现应用程序,这可能会占用大量资源。

我用runOutsideAngular()来规避这个问题。事实证明,我只需要 运行 Angular 之外的一个函数:

this.ngZone.runOutsideAngular(() => {
    this.handleMouseEvents();
});

感谢 Mark van Straten 的意见!