Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Остановить выполнения сценария?


Автор: Сisa 28.8.2014, 09:47
Остановить выполнение сценария?
Сценарий на этой веб-странице замедляет работу IE.
и т.д. ...

 
 Такое сообщение иногда можно видеть для своего скрипта, вопрос в том как избежать подобного, не теряя при этом функциональность самого скрипта?
 Это не window.onerror = null; это система притормаживает.
 Отвечая "продолжить" работа скрипта завершается с отличным результатом, да и само такое сообщение не всегда выскакивает, примерно в половине случаев при тестировании, но для сайта ведь эти сообщения просто недопустимы.


Автор: Aliance 28.8.2014, 10:02
Скорее всего поможет простой рефакторинг кода. while (i++ < 1000000000) - допустимый код, но тормозить браузер он будет.

Автор: Сisa 28.8.2014, 13:00
Рефакторинг: 
признаки плохого кода - посмотрел перечень как бы не очень подходит в моем скрипте,
методы - интересно, но уж больно серьезно,
программы - как бы ими воспользоваться...


Автор: Сisa 28.8.2014, 17:06
Chrome и FF отлично справляются и не тормозят расчеты, даже если сложность их вычисления изначально увеличить (точность, размерность, количество) более чем в 10 раз. IE8 - виноват, потому что IE! Похоже рефакторинг ему что ..  припарка. 

Автор: Aliance 29.8.2014, 07:32
Зависит от кода. Без него - только пальцем в небо. Существует масса хаков именно для ИЕ, так что однозначно крест на нем ставить не стоит.

Автор: AVA12 29.8.2014, 11:29
Насколько я понял, речь идет о тяжелых и длительных расчетах, выполняющихся "в один прием". Вообще так делать некрасиво: из-за однопоточности интерпретатора яваскрипта такой расчет блокирует обработку других событий (если они есть). Лучше разбить задачу на небольшие части, хранить текущее состояние расчетов в глобальной переменной и вынести расчеты в отдельную функцию. Если после обработки очередной части расчет еще не завершен, то функция сохраняет промежуточный итог и устанавливает короткий таймаут, который вызывает эту же функцию. Тогда у гипотетических событий будет шанс отработать без лишних задержек, и браузер перестанет ругаться.

Автор: Сisa 29.8.2014, 15:23
Короткий таймаут скорее всего очень полезная будет штука, не в этот раз так в следующий. Хочу уяснить такую деталь:
 "Если после обработки очередной части расчет еще не завершен, то функция сохраняет промежуточный итог и устанавливает короткий таймаут..." - этот таймаут происходит автоматически? т.е. перед вызовом очередной js функции, операционная система может перехватывать управление и выполнять какие то свои иные неотложные задачи? Или же надо сеттаймеаут писать самому? 
 Если сеттаймеаут, то время конечно можно писать минимальное 10-12, и тем не менее суммарное время выполнения всего скрипта вырастет, но зато не будет проблем с IE.

("в один прием" - ну да, выполнение задачи начинается одной функцией, она уже сама пользуется еще несколькими, в т.ч. с циклами, и те с свою очередь используют еще..., примерно так сейчас)

Автор: AVA12 29.8.2014, 16:29
Цитата
этот таймаут происходит автоматически? т.е. перед вызовом очередной js функции, операционная система может перехватывать управление и выполнять какие то свои иные неотложные задачи? Или же надо сеттаймеаут писать самому?

Нужно писать самому. Просто добавить setTimeout() в обработчике.

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

Автор: Сisa 30.8.2014, 12:17
AVA12, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)