【问题标题】:Excessive use of window.setTimeout过度使用 window.setTimeout
【发布时间】:2016-01-21 18:42:11
【问题描述】:

所以我有这个单页应用程序,每次用户执行诸如单击按钮之类的操作时都会进行大量计算。由于 javascript 不是线程化的,冗长的计算会阻塞 UI 更新并造成糟糕的用户体验:

$('update-btn').click() {
  updateDomWithAnimation();
  doLenghtyCalc();
}

在阅读了太多关于如何处理这个问题的文章之后,我发现用window.setTimeout 包装一些函数调用确实有帮助。因此,有了这些知识,我开始将它们包装起来,它似乎给浏览器带来了一些响应能力。

但是我的问题是,即使延迟仅为 0 或 1,超时语句过多也会产生不良副作用吗?从业务逻辑的角度来看,我确保只有独立的独立函数包含在 setTimeout 中。我想从技术角度进行检查。有没有 JS 大师可以分享一些见解?

P.S:我看过 Web Workers,但我的代码是使用 Jquery 构建的,并且严重依赖于 DOM 状态等,因此无法实现 Web Workers atm,这就是我使用超时的原因 非常感谢!

【问题讨论】:

  • 可能想研究一下使用Web Workers API
  • js 正在客户端设备上运行.. 所以如果你的代码搞砸了某人,那将只是客户端......我仍然不明白你为什么需要这样的延迟......也许你可以告诉我们有关您的方案的更多详细信息
  • @charlietfl:谢谢你的链接,我已经看过了,但是我的代码是使用 Jquery 构建的,并且严重依赖于 DOM 状态等,因此无法实现 web worker atm,这是为什么我使用超时

标签: javascript jquery html dom


【解决方案1】:

虽然从技术上讲,运行多次超时是可以的,但通常建议不要太多。

我们做的一件事是每个都有一个 timeout/setInterval,当它被触发时会运行一组可以随时添加或删除的函数。

///Somewhere
var runnableFunctions = []
var runningIntervalID = window.setInterval(function() { 
    runnableFunctions.forEach(function(func) {
        if(typeof func === 'function') {
            func.call(null);
        }
    }, 1);


/// Elsewhere
$(domElem).on(event, function() {
    runnableFucntions.push(function() {
        //Do something on interval
        // slice out this function if it only needs to run once.
    });
});

这只是一个肮脏的例子,但您知道可以将函数推入数组并让它们在单个超时/间隔内运行,而不是设置许多超时/间隔,然后记住稍后停止它们。

【讨论】:

  • 此外,为了更精细地将数组从函数数组更改为包含所述函数的对象数组。这将使以后更容易定位到删除,或者检查一个是否已经注册。
  • @Amit 在我加入我现在的公司之前,他们有 100 多个注册的计时器来做各种事情。有的挡,有的不挡。当函数开始像这样堆叠时,我们失去了计时器本身的保真度。以 1000 运行的设定间隔开始触发约 10 - 20% 的时间。
  • 虽然不是我能想到的最好的参考资料,但请看here。至少这表明您所描述的问题是众所周知且可以解决的。很难说是否有任何特定浏览器实施了可靠的架构来缓解此问题 - 但我建议在下结论之前彻底测试任何此类假设。
猜你喜欢
  • 1970-01-01
  • 2017-10-29
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多