| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Нужно писать самому. Просто добавить setTimeout() в обработчике. Интерпретатор никак не может прервать обработчик события (тело тега <script> - это, фактически, текст обработчика события "на странице опять встретился яваскрипт"). Только когда обработчик завершился, интерпретатор выбирает из очереди следующее событие и вызывает его обработчик. И только если очередь событий пуста, интерпретатор проверяет, есть ли "просроченные" таймеры, и вызывает их обработчики. |
| Автор: Сisa 30.8.2014, 12:17 |
| AVA12, спасибо! |