| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Конфликты + исключения |
| Автор: Иль 13.7.2005, 19:14 |
| Очень важный для меня вопрос. Очень!!! Дело тут лечить геморой или не личить (и нет гемороя) Как бы знаю, что в браузерах, одна (пока что и слава богу) JavaScript машина. Что по идеи пока пошла обрабатываться одна функция вроде бы другая не будет. Вот хотелось бы знать, так это? Вот еще вопрос: Что, вообще ничего не будет вызываться (по таймингу или по событию) до окончания запущенной функции или что-то может вызваться и стать в очередь на обработку в стеке по тому же или по другому событию или по таймингу. Приведу общую картину моей ситуации По событию пошла выполнятся обработка ноды. Не вклинется ли в середину этого обработчика, функция, запущенная по таймингу тоже обрабатывающая эту ноду (например удаляющая)? Просто, если вклинится и уберет нафиг ноду или объект JavaScript, то я получу document.getElementById(...)=null или еще чего и тогда схлопачу исключение, конечно, если я это не предусмотрю заранее (вот он, геморойчик-то вылез). Понятное дело, что если я такой хитрый и отложу обработку части логики через setTimeout() или через другое событие, то вклинится легко, но это я предусмотрю, а вот хотелось бы быть точно уверенным, что никакая (сволочь Кстати, всем доброго вечера |
| Автор: Иль 13.7.2005, 19:40 |
| Почему заинтересовался. Видел, как в Internet Explorer, в FireFox и Mozilla выскакивают подряд несколько alert() и накладываются друг на друга. Это ИМХО были событийные вызовы алертов. |
| Автор: Aliance 13.7.2005, 20:14 | ||||
Нет, не будет такого.
В ИЕ быть неможет. Сам смотри:
В IE метод http://www.jsguide.spb.ru/reference/client/window/alert.php является перекрывающим -> пока не нажать на кнопку сценарий преостановился и не выполняется. |
| Автор: Sardar 13.7.2005, 20:42 |
| Проблемы нет, в JS под браузерами "многопоточности" как таковой нет. Сначала отработает код работающеий с нодой, затем отработает другой код, хотя так лучше не делать, мало ли чего alert открывает модальное окно, физически не возможно открыть несколько алертов друг на дружке. Модальное значит выполнение скрипта останавливаеться пока окошко не закроеться. |
| Автор: Иль 13.7.2005, 21:01 |
| Слава тебе господи! Спосибо, успокоили, а то я уж за гололву взялся. Уф, спокойные сегодня сны будут снится. Добавлено @ 21:03 Ну тогда можно спокойно отслеживать только внутренние конфликты (внутри одного треда) и не нагружать код |
| Автор: Gregof 14.7.2005, 07:37 | ||||||
Sardar и Aliance вы не правы. Вот пример демонстрирующий несколько алертов(пример под IE):
После того как выскочит первый алерт, надо не закрывать его, а лишь немного подождать второго Алерт действительно блокирует текущую нить, но возможна ситуация возникновения другой. Иль вклиниться в исполнения кода можно лишь в том случае если ты сам отпустишь нить. Если ты этого не делаешь, то и предусматривать возможность неожиданного исчезновения объекта, во время исполнения твоего кода, не надо. Так что:
|
| Автор: Gregof 14.7.2005, 08:02 | ||
Пример под Mozilla немного изощреннее
Так же как и в примере под IE надо немного подождать появления второго алерта не закрывая первого. У меня второй появляется прямо над первым, так что для того чтоб его увидеть второй надо отодвинуть. |
| Автор: Sardar 14.7.2005, 15:17 | ||
| Gregof влепил плюс за ценное замечание Действительно модальное окно ведёт себя "не по модальному", это скорее всего обьясняеться тем, что XMLHttpRequest работает отдельным потоком в бродилке. alert останавливает только текущий поток и вообще в JS по умолчанию один поток.
Таймауты откладывают выполнение кода и после вызова сразу идут вперёд. Но таймауты исполняються не в отдельных потоках (по моему по историческим причинам, когда NN умирал от любого таймаута, а сейчас все маньячат из-за совместимости). В результате таймаут начинает работу после того как основной поток освобождён. ИМХО это не правильно, лучше бы таймауты в разных потоках работали, правда тогда потребуються механизмы синхронизаций. Юзая "левые" обьекты можно открыть больше потоков исполнения, хотя это изврат. Интересно приведёт ли это к проблемам синхронизации, например если из обработчика XMLHttpRequest.onreadystatechange удалить ноду в документе, которая в данный момент отрабатываеться в другом(основном) потоке? |