Как мешать интенсивному циклу JavaScript заморозить браузер

В IntelliJ наверняка есть Gradle: https://www.jetbrains.com/help/idea/getting-started-with-gradle.html

Итак, вы можете либо используйте Gradle или Maven. Или вы также можете добавить jar в качестве зависимости к вашему проекту, но я не буду этого рекомендовать.

56
задан Chris B 20 August 2009 в 21:20
поделиться

6 ответов

Я угробил бы "каждую" функцию в пользу для цикла, так как это быстрее. Я также добавил бы, что некоторые ожидают с помощью "setTimeout", но только время от времени и только если необходимый. Вы не хотите ожидать 5 мс каждый раз, потому что затем обработка 3 500 записей заняла бы приблизительно 17,5 секунд.

Ниже пример с помощью для цикла, который обрабатывает 100 записей (можно настроить это) в интервалах на 5 мс, который дает 175 мс наверху.

var xmlElements = $(xmlDoc).find('Object');
var length = xmlElements.length;
var index = 0;
var process = function() {
  for (; index < length; index++) {
    var toProcess = xmlElements[index];
    // Perform xml processing
    if (index + 1 < length && index % 100 == 0) {
        setTimeout(process, 5);
    }
  }
};
process();

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

// start benchmark
var t = new Date();
// some xml processing
console.log("Time to process: " + new Date() - t + "ms");

Надеюсь, это поможет.

68
ответ дан Helgi 26 November 2019 в 17:20
поделиться

Установите тайм-аут между обработкой, чтобы препятствовать тому, чтобы цикл цикла съел все ресурсы браузера. Всего только потребовалось бы несколько секунд, чтобы обработать и циклично выполниться через все, весьма разумное для 3 500 элементов.

var xmlElements = $(xmlDoc).find('Object');

var processing = function() {
  var element = xmlElements.shift();

  //process element;

  if (xmlElements.length > 0) {
    setTimeout(processing, 5);
  }
}

processing();
22
ответ дан tj111 26 November 2019 в 17:20
поделиться

Я считал бы преобразование этих 3 500 элементов от xml до серверной стороны JSON или еще лучшей загрузки этим к серверу преобразованный, так, чтобы это было собственным к JS с самого начала.

Это минимизировало бы Вашу загрузку, и пролил делают размер файла меньшим также.

6
ответ дан Mikko Tapionlinna 26 November 2019 в 17:20
поделиться

JavaScript является однопоточным, таким образом, кроме setTimeout, нет очень, можно сделать. Если использование Google Gears является опцией для Вашего сайта, они обеспечивают способность запустить JavaScript в истинном фоновом потоке.

2
ответ дан Gabe Moothart 26 November 2019 в 17:20
поделиться

Вы можете setTimeout () с продолжительностью НУЛЯ, и это уступит, как желаемый

2
ответ дан Scott Evernden 26 November 2019 в 17:20
поделиться

Вы могли использовать рабочих HTML5 API, но это будет только работать над Firefox 3.1 и Safari 4 бета банкомата.

1
ответ дан olliej 26 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: