5

我有一些 javascript/jquery 代码(用于内部网站),在大表上进行大量客户端处理。它运行有点慢,但没关系。

问题是它在运行它需要执行的循环时冻结了浏览器。这有两个不良影响:

  1. 处理微调器(一个动画 gif,但我也尝试了 spin.js 并且有同样的问题)冻结。
  2. 如果表中有足够的行,则循环需要很长时间并且浏览器会报告一个无响应的脚本

有没有一种方法可以在代码中添加某种“呼吸”语句,这样每(比如)100 次迭代,它就会暂停以让微调器旋转并且浏览器知道脚本仍在处理它?类似(伪代码):

for (i=0;i<20000;i++)
{
    fnProcessRow();
    if (i % 100 == 0) breath();
}
4

3 回答 3

1

分解 javascript 的一种方法是将处理分成块并使用 setTimeout() 执行下一个“块”

如果您需要一些代码来向您展示我的意思,请告诉我。

于 2013-03-05T21:06:43.133 回答
1

没有设置方法来执行此操作,因为它非常具体地取决于您的代码。像这样的东西会起作用:

fnProcessRows(0, 10000);

function fnProcessRows(start, end) {
    /* do row processing */

    if (end < totalRows) {
        setTimeout(function () {
            fnProcessRows(start + 10000, end + 10000);
        }, 1000);
    }
});

这将处理 10000 行,中间有 1 秒的中断。这可能会产生奇怪的副作用,例如显示“已处理”行和“未处理”行,这可能是不可取的。如果不是,那么这应该是一个非常简单的解决方案来提供帮助。

如果仍然没有响应,您当然可以将 10000 减少到其他值;它应该只在很短的时间内没有响应,用户很难注意到。

于 2013-03-05T21:07:08.920 回答
0

看到这个问题

如果您不想使用 setTimeout/setInterval 路线,请尝试添加:

if (i % 100) { $("selector for your animated image").width(); }

在某些(大多数?)浏览器上会强制它重新布局和渲染。

于 2013-03-05T21:12:14.913 回答