使用setTimeout绕过IE的长时间运行脚本警告

时间:2011-10-04 23:51:22

标签: javascript internet-explorer settimeout

之前我曾经问过这个问题,并且在网上找到了一些关于这个主题的文章,但对于我的生活,我无法弄清楚这一点。我有一组计算模型的Javascript函数,但是有大量的循环使脚本需要一段时间(~4秒)。我不介意处理时间,但IE提示警告,因为有太多的执行。

我已经尝试优化我的代码,但我根本无法减少足以绕过IE警告的执行次数。因此,我认为我必须使用setTimeout函数来重置IE中的计数器。

代码很长,我无法弄清楚如何在IE中正确实现setTimeout。我尝试过模仿here找到的代码,但由于某种原因,它在第100次迭代后最终崩溃。

我不知道这是否很常见,但如果我发送给他们,有人会介意看一下代码吗?我只是不想在这里发布它,因为它非常冗长。

谢谢!

编辑:我已将我的代码放在JSfiddle上,正如一些人所建议的那样。你可以找到它here。感谢您的建议,如果有任何问题请与我联系!

1 个答案:

答案 0 :(得分:6)

我使用的基本方法是将工作分成批次。每批都在一个“纪元”中完成,在批处理完成时,它调用setTimeout()来启动下一个纪元。

假设您有1000次迭代运行;你可以把它分成100个批次。

function doTheWork(operation, cycles, callback) {
    var self = this, // in case you need it
        cyclesComplete = 0,
        batchSize = 100;

    var doOneBatch = function() {
        var c = 0;
        while(cyclesComplete < cycles) {
            operation();
            c++;
            if(c >= batchSize) {
                // may need to store interim results here
                break;
            }
            cyclesComplete++;
        }
        if (cyclesComplete < cycles) {
            setTimeout(doOneBatch, 1);
        }
        else {
            callback(); // maybe pass results here
        }
    };

    // kickoff
    doOneBatch();
    return null;
};