Обход предупреждения долгосрочного скрипта IE с помощью setTimeout - PullRequest
4 голосов
/ 05 октября 2011

Я спрашивал об этом раньше и нашел в Интернете несколько статей на эту тему, но я не могу этого понять.У меня есть набор функций Javascript, которые вычисляют модель, но происходит множество циклов, которые заставляют сценарий занимать некоторое время (~ 4 секунды).Я не против времени обработки, но IE выдает предупреждение с большим количеством выполнений.

Я пытался оптимизировать свой код, но я просто не могу сократить количество выполнений, достаточное дляобойти предупреждение IE.Поэтому я считаю, что должен использовать функцию setTimeout для сброса счетчика в IE.

Код довольно длинный, и я просто не могу понять, как правильно реализовать setTimeout в IE.Я пытался имитировать найденный код здесь , но по какой-то причине он завершается сбоем после 100-й итерации.

Я не знаю, распространено ли это вообще, но будет ли кто-нибудьвозражаете взглянуть на код, если я отправлю его им?Я просто не хотел бы публиковать это здесь, потому что это довольно долго.

Спасибо!

РЕДАКТИРОВАТЬ: Я поместил свой код в JSfiddle, как некоторые людипредложил.Вы можете найти это здесь .Спасибо за предложение и дайте мне знать, если есть какие-либо вопросы!

1 Ответ

6 голосов
/ 05 октября 2011

Основной подход, который я использую, состоит в том, чтобы разбить работу на партии.Каждый пакет выполняется в одну «эпоху», и по завершении пакета он вызывает 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;
};
...