LINUX.ORG.RU

А в FF alert блокирующая операция?

 ,


0

1

вот такой код


<html>
  <head> 
  </head>
  <body>

MAIN
 
<script>
xhr=new XMLHttpRequest()
xhr.open("GET", "http://localhost:8888/foo", true)
xhr.onreadystatechange=function(){
   if(xhr.readyState==4)document.write(xhr.responseText)
}
xhr.send()
alert("foo")

</script>
</body>
</html>
а на сервере поставил задержку отвера 3 сек. В V8 alert заблокировал аджакс, а в FF, на мое удивление — нет. Если вместо document.write написать alert, при отрабатывании аякса всплывает второй алерт прямо поверх первого, LOL. чезанах? Может в FF алерт — неблокирующая операция? А как, интересно, насчет прочих промптов, конфирмов?

UPD вот еще что выяснил. Если первым алерт вызывается из аякса (я убрал задержку сервера, и аджакс отработал сразу — как синхронный), он блочит второй алерт, все таки. Черт голову сломит, короче.



Последнее исправление: idiottoop (всего исправлений: 4)

Делай синхронный AJAX-запрос https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_a...

Но что-то мне подсказывает что ты какой-то кал хочешь сделать. И document.write это плохо, равно как и синхронные запросы.

Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 3)
Ответ на: комментарий от Black_Roland

И document.write это плохо, равно как и синхронные запросы.

А, кстати, чем это плохо, в каком смысле плохо? И при чем тут синхронные запросы?

idiottoop
() автор топика

А как может быть несинхронный alert, я что-то не понимаю. JS по определению однопоточный же.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Я сам нехнепонел. Но факт остается фактом. Можешь сам попробовать. Алерт даже не блокирует другой алерт.

idiottoop
() автор топика
Ответ на: комментарий от Legioner

А как может быть несинхронный alert

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

idiottoop
() автор топика
Ответ на: комментарий от idiottoop

А нах*я синхронный? Тогда весь смысл эксперимента теряется.

Что ты вообще хочешь получить? Если просто ради сравнения, то поздравляю, ты понял что Firefox и Chrome отличаются.

Black_Roland ★★★★
()
Ответ на: комментарий от Black_Roland

Да, просто эксперимент. Просто, не совсем логично, все таки получается. Например


setTimeout(function(){console.log("foo")})
console.log("bar")
//  bar
//  foo
Тут, несмотря на то, что задержка не выставлена, колбэк все равно бросается в очередь. А в фф, получается такая фигня. Если задержка ответа от сервера минимальна, (какая то задержка все равно есть, правильно), аджакс на какое-то время блочит поток, все таки, даже несмотря на асинхронность оного. То есть, выходит, мы делаем асинхронный запрос, а он на какое то время блочит поток, пытаясь выполнится синхронно. А по истечению какого то времени, бросает коллбек в очередь. И вот если он бросил, последующий алерт его не блочит. А если наоборот, отработал первым алерт из аякса, поток будет заблокирован, и следующий алерт не отработает, пока не уберешь первый. Такие дела...

idiottoop
() автор топика

Не используй алерты. Они — говно. Не шутка.

Синхронные запросы тоже не используй, их грозятся выпилить нахрен.

anonymous
()
Ответ на: комментарий от risenshnobel

А вот в confirm и prompt - требует.

Щас попробовал — с ними все то же самое

idiottoop
() автор топика
Ответ на: комментарий от idiottoop

Ну т.е. после алерта код отрабатывается, пока алерт показывается? Если так, то нормально, в однопоточную модель укладывается, хотя, конечно, лучше бы между браузерами было одинаковое поведение.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Я не совсем понимаю, о чем Вы говорите. Асинхронность и однопоточность — это как теплое и мягкое, по-моему.

idiottoop
() автор топика
Ответ на: комментарий от Legioner

Асинхронность означает лишь то, что код не блокирует поток. Многопоточность тут хз каким боком оказалась.

idiottoop
() автор топика
Ответ на: комментарий от idiottoop
var x = 1;
...
var oldX = x;
alert("bla");
var newX = oldX + 1;
x = newX;
console.log(x);

Этот код должен выводить «2, 3» в однопоточной модели выполнения и будет выволить «2, 2», если у нас два потока выполнения (если оба alert-а вывелись одновременно и две точки выполнения «повисли»). Собственно все джаваскриптеры умеют только однопоточную модель и огромная куча библиотек поломается на многопоточном коде.

Legioner ★★★★★
()
Ответ на: комментарий от idiottoop

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

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Я долго думал, но не догнал:) По моему, в асинхронной однопоточной модели, проблема совместного доступа тоже может возникать. Я запускаю, допустим, несколько интервалов, которые, меняют какие то переменные, в зависимости от чего-то там, или рандомно. Как я могу быть уверен, что переменная не изменилась в текущий момент? Я же не знаю, в общем случае, когда отработал тот или иной интервал. То что вы говорите, так же можно рассуждать и про многопоточную модель, у нас же кооперативность а не реальный параллелизм. То есть, одновременно два процесса не могут иметь одно и то же процессорное время. Но не будешь же стоять с ружьем и отслеживать каждый такт процессора?

idiottoop
() автор топика
Ответ на: комментарий от idiottoop

Я долго думал, но не догнал:) По моему, в асинхронной однопоточной модели, проблема совместного доступа тоже может возникать. Я запускаю, допустим, несколько интервалов, которые, меняют какие то переменные, в зависимости от чего-то там, или рандомно. Как я могу быть уверен, что переменная не изменилась в текущий момент?

Тут важно то, что если есть последовательность операций, то пока она выполняется, ни один таймаут, ни один интервал не влезут «посередине» и не изменят переменную, поломав логику.

var x;
...
x = 1;
y = x + 1;
...
setInterval(function() { x = 2; }, 1);

вот в этом коде я гарантированно получаю y = 2. В случае с многопоточностью – легко можно получить y = 3. Пока мой код не закончит выполнение, никуда управление не передастся. Вот когда закончит выполнение, там может и интервал запуститься. Который опять же будет работать, пока не завершит выполнение своей функции, никому не отдавая управление, ни коллбэкам от аякс-запросов, ни onclick-хендлерам, ни другим таймерам.

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

Как это не реальный параллелизм? Сейчас даже на смартфонах по 4 ядра стоит. Ещё какой реальный. С отдельными кешами для каждого ядра, так, что каждое ядро легко может видеть своё значение для разделяемой переменной.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Как это не реальный параллелизм? Сейчас даже на смартфонах по 4 ядра стоит

А что, у нас распространенные оси windows nt, linux, mac, уже перестали быть системами с вытесняющей многозадачностью? Какая разница высокоуровневым приложениям, на скольких ядрах работают их процессы? Это ничего не меняет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.