Я неоднократно вхожу в проблемы с "Этим сценарием Internet Explorer, занимает слишком много времени выполнять, хотели бы Вы продолжаться?" сообщения. Я задаюсь вопросом, знает ли кто-либо об умном способе обмануть механизм JS в сохранение спокойствия? На основе некоторого поиска я сделал, я нашел, что мониторы механизма указывают, что он думает, потенциально могло быть бесконечно цикличное выполнение, таким образом, я думал, возможно, что я мог добавить некоторую логику для изменения выполнения время от времени для одурачивания его в оставление в покое его, но никакую удачу. Я также пытался разбить более длинный цикл в несколько более коротких, но это не помогло. Конкретно код, который в настоящее время вызывает проблемы, является расширением узлов в древовидной структуре. Код является цикличным выполнением по текущим узлам и расширяющий каждого. Это - тривиальная вещь записать в JavaScript, но я не могу позволить эти ошибки из-за тайм-аута, таким образом, я думаю, что моя единственная опция могла бы состоять в том, чтобы запросить предварительно расширенные данные представления через Ajax. Я в настоящее время работаю в среде DEV с маленьким (выход) набор данных, и я знаю, что это не полетит в других средах. Кому-либо удалось подавить эти предупреждения?
Вы пытались заставить его выводить что-то время от времени? Возможно, он просто проверяет вывод, и если его не было в течение x секунд, предполагается, что вы находитесь в бесконечном цикле.
Если вывод работает, вы можете попробовать что-то вроде добавления и немедленного удаления чего-то очень маленького (например, пустого
).
Я думаю, что время ожидания больше зависит от количества операторов, чем от времени или эвристики. Вы можете пройти долгий путь к увеличению объема, который ваш код может обработать, прежде чем вызывать предупреждение, оптимизировав свой код для простых вещей - особенно если вы используете вспомогательные 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», сохраните результат в переменной и используйте его там, где это имеет смысл.
Очевидно, я понятия не имею, как выглядит ваш код, но держу пари, что вы могли бы многое сделать для его улучшения, поскольку эти мелочи действительно складываются, когда вы говорите об этой проблеме тайм-аута.
Хороший способ - имитировать многопоточное выполнение с помощью вызовов функций setTimeout ()
. Это требует разделения всей обработки на более мелкие части и постановки их в очередь одну за другой. Таймауты могут быть установлены довольно близко друг к другу, но они будут запускаться один за другим, когда каждый из них завершит выполнение.
Очень распространенное решение этой проблемы - использование функции 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/
.Как насчет того, чтобы разделить его с помощью серии событий. Таким образом, возникает цикл, отправляет событие, слушатель триггеров событий и выполняет цикл. и т. д.?
Почему бы не разбить вашу функцию на ряд шагов и не поставить их в очередь с помощью jQuery?
Мне удалось сделать это с помощью прототипов метода Function # defer, который по сути аналогичен методу setTimeout. Спасибо всем!