Обманывают движок Javascript Internet Explorer, позволяющий запустить скрипт - PullRequest
5 голосов
/ 22 июня 2010

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

Ответы [ 7 ]

5 голосов
/ 22 июня 2010

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

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

1 голос
/ 22 июня 2010

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

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

1 голос
/ 22 июня 2010

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

0 голосов
/ 22 июня 2010

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

0 голосов
/ 22 июня 2010

Я думаю, что время ожидания больше зависит от количества операторов, чем от времени или эвристики. Вы могли бы пройти долгий путь к увеличению объема, который может обрабатывать ваш код, прежде чем вызывать предупреждение, оптимизируя ваш код для простых вещей, особенно если вы используете вспомогательные 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 голосов
/ 22 июня 2010

Очень распространенным решением этой проблемы является использование функции 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 голосов
/ 22 июня 2010

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

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

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