Одурачивание Internet Explorer механизм JavaScript в разрешение запущенному скрипту

Я неоднократно вхожу в проблемы с "Этим сценарием Internet Explorer, занимает слишком много времени выполнять, хотели бы Вы продолжаться?" сообщения. Я задаюсь вопросом, знает ли кто-либо об умном способе обмануть механизм JS в сохранение спокойствия? На основе некоторого поиска я сделал, я нашел, что мониторы механизма указывают, что он думает, потенциально могло быть бесконечно цикличное выполнение, таким образом, я думал, возможно, что я мог добавить некоторую логику для изменения выполнения время от времени для одурачивания его в оставление в покое его, но никакую удачу. Я также пытался разбить более длинный цикл в несколько более коротких, но это не помогло. Конкретно код, который в настоящее время вызывает проблемы, является расширением узлов в древовидной структуре. Код является цикличным выполнением по текущим узлам и расширяющий каждого. Это - тривиальная вещь записать в JavaScript, но я не могу позволить эти ошибки из-за тайм-аута, таким образом, я думаю, что моя единственная опция могла бы состоять в том, чтобы запросить предварительно расширенные данные представления через Ajax. Я в настоящее время работаю в среде DEV с маленьким (выход) набор данных, и я знаю, что это не полетит в других средах. Кому-либо удалось подавить эти предупреждения?

5
задан Adam 21 June 2010 в 20:31
поделиться

7 ответов

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

Если вывод работает, вы можете попробовать что-то вроде добавления и немедленного удаления чего-то очень маленького (например, пустого ).

0
ответ дан 14 December 2019 в 08:42
поделиться

Я думаю, что время ожидания больше зависит от количества операторов, чем от времени или эвристики. Вы можете пройти долгий путь к увеличению объема, который ваш код может обработать, прежде чем вызывать предупреждение, оптимизировав свой код для простых вещей - особенно если вы используете вспомогательные API в другой библиотеке, такой как jQuery. Например, измените это:

$.each(arr, function(value) {
   // do stuff
});

на это:

for (var i = 0, l = arr.length; i < l; i++) {
   var value = arr[i];
   // do stuff
}

Еще один простой способ - доступ к кешу для полей. Если у вас есть два экземпляра «foo.bar», сохраните результат в переменной и используйте его там, где это имеет смысл.

Очевидно, я понятия не имею, как выглядит ваш код, но держу пари, что вы могли бы многое сделать для его улучшения, поскольку эти мелочи действительно складываются, когда вы говорите об этой проблеме тайм-аута.

0
ответ дан 14 December 2019 в 08:42
поделиться

Использование setTimeout

Хороший способ - имитировать многопоточное выполнение с помощью вызовов функций setTimeout () . Это требует разделения всей обработки на более мелкие части и постановки их в очередь одну за другой. Таймауты могут быть установлены довольно близко друг к другу, но они будут запускаться один за другим, когда каждый из них завершит выполнение.

5
ответ дан 14 December 2019 в 08:42
поделиться

Очень распространенное решение этой проблемы - использование функции setTimeout. То, как вы это делаете, состоит в том, что вы разделяете процесс на более мелкие части, а затем выполняете эти части одну за другой с помощью функции setTimeout. Думаю, это http://www.julienlecomte.net/blog/2007/10/28/ должно вам помочь. Существует также еще одна опция, представленная HTML5 WebWorkers. Этот новый стандарт должен позволить вам выполнять длительные задачи в отдельном потоке, а затем сообщать о любых результатах в обратном вызове. Вы можете прочитать об этом здесь robertnyman.com/2010/03/25/using-html5-web-workers-to-have-background-computational-power/ К сожалению, IE не поддерживает его согласно html5demos.com/

.
0
ответ дан 14 December 2019 в 08:42
поделиться

Как насчет того, чтобы разделить его с помощью серии событий. Таким образом, возникает цикл, отправляет событие, слушатель триггеров событий и выполняет цикл. и т. д.?

1
ответ дан 14 December 2019 в 08:42
поделиться

Почему бы не разбить вашу функцию на ряд шагов и не поставить их в очередь с помощью jQuery?

http://api.jquery.com/queue/

1
ответ дан 14 December 2019 в 08:42
поделиться

Мне удалось сделать это с помощью прототипов метода Function # defer, который по сути аналогичен методу setTimeout. Спасибо всем!

0
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

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