Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конфликты + исключения, Помогите, разъясните 
:(
    Опции темы
Иль
Дата 13.7.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Очень важный для меня вопрос. Очень!!!
Дело тут лечить геморой или не личить (и нет гемороя)

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

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

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

Это сообщение отредактировал(а) Иль - 13.7.2005, 19:38


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 13.7.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 13.7.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Нет, не будет такого.

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

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

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

В IE метод window.alert() является перекрывающим -> пока не нажать на кнопку сценарий преостановился и не выполняется.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 13.7.2005, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



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

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 13.7.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Gregof
Дата 14.7.2005, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 3.6.2004

Репутация: 1
Всего: 12



Цитата(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
Алерт действительно блокирует текущую нить, но возможна ситуация возникновения другой.

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

--------------------
Может поздно, может рано, нет у времени стоп-крана... (Чайф)
PM MAIL ICQ   Вверх
Gregof
Дата 14.7.2005, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 3.6.2004

Репутация: 1
Всего: 12



Пример под 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 надо немного подождать появления второго алерта не закрывая первого. У меня второй появляется прямо над первым, так что для того чтоб его увидеть второй надо отодвинуть.
--------------------
Может поздно, может рано, нет у времени стоп-крана... (Чайф)
PM MAIL ICQ   Вверх
Sardar
Дата 14.7.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.