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


Автор: Иль 13.7.2005, 19:14
Очень важный для меня вопрос. Очень!!!
Дело тут лечить геморой или не личить (и нет гемороя)

Как бы знаю, что в браузерах, одна (пока что и слава богу) JavaScript машина. Что по идеи пока пошла обрабатываться одна функция вроде бы другая не будет. Вот хотелось бы знать, так это?
Вот еще вопрос: Что, вообще ничего не будет вызываться (по таймингу или по событию) до окончания запущенной функции или что-то может вызваться и стать в очередь на обработку в стеке по тому же или по другому событию или по таймингу.

Приведу общую картину моей ситуации
По событию пошла выполнятся обработка ноды. Не вклинется ли в середину этого обработчика, функция, запущенная по таймингу тоже обрабатывающая эту ноду (например удаляющая)? Просто, если вклинится и уберет нафиг ноду или объект JavaScript, то я получу document.getElementById(...)=null или еще чего и тогда схлопачу исключение, конечно, если я это не предусмотрю заранее (вот он, геморойчик-то вылез). Понятное дело, что если я такой хитрый и отложу обработку части логики через setTimeout() или через другое событие, то вклинится легко, но это я предусмотрю, а вот хотелось бы быть точно уверенным, что никакая (сволочь smile) функция не подпортит мне малину.

Кстати, всем доброго вечера smile. А у кого не вечер, то тоже доброго чего-то там по вашему усмотрению smile

Автор: Иль 13.7.2005, 19:40
Почему заинтересовался. Видел, как в Internet Explorer, в FireFox и Mozilla выскакивают подряд несколько alert() и накладываются друг на друга. Это ИМХО были событийные вызовы алертов.

Автор: Aliance 13.7.2005, 20:14
Нет, не будет такого.

Цитата
Видел, как в Internet Explorer, в FireFox и Mozilla выскакивают подряд несколько alert() и накладываются друг на друга. Это ИМХО были событийные вызовы алертов.

В ИЕ быть неможет. Сам смотри:
Код

for (var i = 0; i < 5; i++) {
   alert(i);
}

В IE метод http://www.jsguide.spb.ru/reference/client/window/alert.php является перекрывающим -> пока не нажать на кнопку сценарий преостановился и не выполняется.

Автор: Sardar 13.7.2005, 20:42
Проблемы нет, в JS под браузерами "многопоточности" как таковой нет. Сначала отработает код работающеий с нодой, затем отработает другой код, хотя так лучше не делать, мало ли чего smile

alert открывает модальное окно, физически не возможно открыть несколько алертов друг на дружке. Модальное значит выполнение скрипта останавливаеться пока окошко не закроеться.

Автор: Иль 13.7.2005, 21:01
Слава тебе господи! Спосибо, успокоили, а то я уж за гололву взялся. Уф, спокойные сегодня сны будут снится.
Добавлено @ 21:03
Ну тогда можно спокойно отслеживать только внутренние конфликты (внутри одного треда) и не нагружать код smile

Автор: Gregof 14.7.2005, 07:37
Цитата(Sardar @ 13.7.2005, 20:42)
alert открывает модальное окно, физически не возможно открыть несколько алертов друг на дружке. Модальное значит выполнение скрипта останавливаеться пока окошко не закроеться.

Sardar и Aliance вы не правы.
Вот пример демонстрирующий несколько алертов(пример под IE):
Код

var ws=new ActiveXObject('Microsoft.XMLHTTP');
ws.onreadystatechange = function () {
    if(ws.readyState == 4) 
        alert('second alert');
};
ws.open("POST","http://forum.vingrad.ru",true);
ws.send("");
alert('first alert');

После того как выскочит первый алерт, надо не закрывать его, а лишь немного подождать второго smile
Алерт действительно блокирует текущую нить, но возможна ситуация возникновения другой.

Иль вклиниться в исполнения кода можно лишь в том случае если ты сам отпустишь нить. Если ты этого не делаешь, то и предусматривать возможность неожиданного исчезновения объекта, во время исполнения твоего кода, не надо. Так что:
Цитата
Ну тогда можно спокойно отслеживать только внутренние конфликты (внутри одного треда) и не нагружать код
- вполне справедливое утверждение.

Автор: Gregof 14.7.2005, 08:02
Пример под Mozilla немного изощреннее smile :
Код

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var ws=new XMLHttpRequest();
ws.onreadystatechange = function () {
    if(ws.readyState == 4) 
        alert('second alert');
};
ws.open("POST","http://forum.vingrad.ru",true);
ws.send("");
setTimeout(function(){alert('first alert');},100);

Так же как и в примере под IE надо немного подождать появления второго алерта не закрывая первого. У меня второй появляется прямо над первым, так что для того чтоб его увидеть второй надо отодвинуть.

Автор: Sardar 14.7.2005, 15:17
Gregof влепил плюс за ценное замечание smile

Действительно модальное окно ведёт себя "не по модальному", это скорее всего обьясняеться тем, что XMLHttpRequest работает отдельным потоком в бродилке. alert останавливает только текущий поток и вообще в JS по умолчанию один поток.

Код
window.setTimeout("alert(1)", 3000);
window.setTimeout("alert(2)", 2000);
window.setTimeout("alert(3)", 1000);
alert(4);

Таймауты откладывают выполнение кода и после вызова сразу идут вперёд. Но таймауты исполняються не в отдельных потоках (по моему по историческим причинам, когда NN умирал от любого таймаута, а сейчас все маньячат из-за совместимости). В результате таймаут начинает работу после того как основной поток освобождён. ИМХО это не правильно, лучше бы таймауты в разных потоках работали, правда тогда потребуються механизмы синхронизаций.

Юзая "левые" обьекты можно открыть больше потоков исполнения, хотя это изврат. Интересно приведёт ли это к проблемам синхронизации, например если из обработчика XMLHttpRequest.onreadystatechange удалить ноду в документе, которая в данный момент отрабатываеться в другом(основном) потоке? smile

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