«Прекратить запуск этого скрипта» - IE для больших запросов AJAX - PullRequest
7 голосов
/ 19 декабря 2009

Я использую jQuery.getJSON (...) для ответа на вызов / процесс для небольшого набора данных. Ожидается, что время отклика составит пару секунд (есть анимированная графика загрузки, чтобы успокоить пользователя).

При этом графика загрузки, ответ, процесс и т. Д. Работают нормально во всех браузерах. Однако в Internet Explorer (6/7/8) появляется ошибка «Остановить выполнение этого сценария». Если разрешено продолжить, сценарий завершается без проблем.

$(document).ready(function() {
    $("#tree").treeview({ collapsed: true, animated: "slow" });
    $("#tree").hide();

    $("#loadingGraphic").fadeIn("slow");

    $.getJSON("mygenerichandler.ashx", function(data) {
        //manipulate data and add to treeview

        $("#loadingGraphic").fadeOut("slow", function() {
            $("#tree").slideDown("slow");
        });
    });
});

Я понимаю, что у этого Internet Explorer есть предпочтение, которое вы можете установить через реестр Windows, однако мне интересно, как другие разработчики обрабатывают ожидаемые большие или медленные ответы обратно в запросе AJAX.

Ответы [ 4 ]

5 голосов
/ 19 декабря 2009

Я предполагаю, что это не загрузка данных и не обработка данных, которые вы делаете в коде. Я думаю, что это преобразование данных JSON, полученных по HTTP, в объект Javascript.

IE в основном выполняет eval () для построения хеша из строковых данных. Это очень, очень, очень неэффективно для длинных струн. Я подозреваю, что за этим стоит алгоритм Schlemiel the Painter . Год или два назад у меня было то же самое, и я решил эту проблему, удалив неиспользуемые или избыточные данные из строки JSON.

Если вы не можете сократить строку, удалив элементы, вы можете попробовать разбить строку на сервере, разбив ее на составляющие объекты ( 'pages' , если хотите) и извлечь их. по одному. Таким образом, вам не нужно платить неэффективный налог на обработку длинных строк и обрабатывать несколько коротких строк.

4 голосов
/ 19 декабря 2009

Медленное уведомление сценария, скорее всего, относится не к реальному запросу, а к сценарию, который вы запускаете для обработки данных, полученных запросом. Это также может быть код jQuery, который анализирует ваш JSON.

Если вы опубликуете свой сценарий, который «манипулирует данными» (т. Е. Прокомментированная часть в вашем фрагменте), мы могли бы помочь в его оптимизации.

[Редактировать] Вы правы. Вы должны рассмотреть ленивую загрузку дерева. Сколько корневых узлов у вас обычно есть? Возможно, вам повезет, вытащив appendTo() из цикла. Либо создайте весь HTML-код за один раз, либо выполните массивный appendTo(), либо используйте промежуточный div, не присоединенный к DOM, для накопления узлов, а затем добавьте к основному элементу #tree.

var tempDiv = $('<div></div>');
for (var i in data) {
    tempDiv.append($(buildHierarchy(data[i]));
}
$("#tree").append(tempDiv);
$("#tree").treeview({ add: tempDiv }); //don't know if this works? Maybe tempDiv.children() ?
2 голосов
/ 19 декабря 2009

Проблема не во времени запроса. Запрос асинхронный, поэтому сценарий не выполняется, пока вы ожидаете ответа.

Это скрипт, который обрабатывает результат, который занимает слишком много времени. Отправьте его в функцию, которая обрабатывает часть данных и вызывает себя, используя таймер, чтобы на мгновение вернуть элемент управления браузеру:

function handleData(data, offset) {
  // pick the next 1000 items or so:
  var size = Math.min(1000, data.length - offset);
  // process [offset .. offset+size-1] of the data
  // ...
  offset += size;
  if (offset < data.length) {
    window.setTimeout(function() { handleData(data, offset); }, 1);
  } else {
    $("#loadingGraphic").fadeOut("slow", function() {
      $("#tree").slideDown("slow");
    });
  }
}

Позвоните с помощью:

$.getJSON("mygenerichandler.ashx", function(data) {
  handleData(data, 0);
});
0 голосов
/ 19 декабря 2009

Вы можете выполнить рефакторинг кода так, чтобы он вызывал setTimeout (0) перед каждым рекурсивным вызовом, чтобы поток пользовательского интерфейса получал контроль и мог реагировать. Google 'setTimeout threading' для получения дополнительной информации.

Вы также можете разбить большой набор данных на куски, обрабатываемые последовательными запросами. В IE8 может потребоваться перепроверить, используется ли собственный метод JSON.parse (), поскольку он быстрее, чем реализация JS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...