История изменений
Исправление user_id_68054, (текущая версия) :
в ff коллбек от xhr или setTimeout выполняется в другом потоке параллельно основному, а в хроме, как положено, будет исполнено только когда основной поток прекратится. Весёлые, знаете ли, сайд-эффекты бывают.
никогда setTimeout (и xhr) НЕ не выполняется внутри параллельного потока.. ни в Firefox , ни в других браузерах... :) .. это просто было смешно предположить параллельный поток...
если в Firefox вы используете блокирующие функции — то код setTimeout выполняется внутри этих блокируюзих функциях , НО КОД НЕ ВЫПОЛНЯЕТСЯ ПАРАЛЛЕЛЬНО — НИ КОГДА (кроме как через worker)..
если не веришь — вот тебе простой тест. :)
$ cat index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>firefox-thread-safe-test</title>
<style>
/*<![CDATA[*/
body {
font-family: sans-serif;
background: white;
color: black
}
a {
color: blue;
}
.page {
margin: auto;
max-width: 1000px;
}
/*]]>*/
</style>
<script>
//<![CDATA[
(function (global) {
'use strict'
var module = global.app_main = {
THREAD_SAFE_ERROR_STR: '*** ВНИМАНИЕ!! ОБНАРУЖЕНО ЧТО БРАУЗЕР (функция setTimeout) НЕ ЯВЛЯЕТСЯ ПОТОКОБЕЗОПАСНЫМ!!! ***',
THREAD_COUNT: 100, // количество потоков [на самом деле -- лишь ПСЕВДОпотоков получаемых через setTimeout()]
THREAD_TIMEOUT: 1, // количество миллисекунд для setTimeout()
create_test_object: function () {
var test_object = {
_is_unsafe_state: false, // переменная отвечающая за НЕбезопаснось состояния
get_state: function () {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #1
alert(module.THREAD_SAFE_ERROR_STR)
return
}
return test_object._state_value
},
set_state: function (value) {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #2
alert(module.THREAD_SAFE_ERROR_STR)
return
}
test_object._is_unsafe_state = true
test_object._state_value = value
test_object._is_unsafe_state = false
},
}
return test_object
},
run_test: function (test_name, test_object, status_line_elem) {
var new_value = test_name + ': ' + Math.floor(Math.random() * 1000000).toString()
test_object.set_state(new_value)
status_line_elem.textContent = 'Обновлённое состояние: ' + new_value
if (test_object.get_state() != new_value) {
// XXX ПРОВЕРКА #3
alert(module.THREAD_SAFE_ERROR_STR)
return
}
setTimeout(function () {
module.run_test(test_name, test_object, status_line_elem)
}, module.THREAD_TIMEOUT)
},
main: function () {
var test_object = module.create_test_object()
var status_line_elem = document.querySelector('.status-line-object')
status_line_elem.innerHTML = ''
// запускает МНОГО паралельных тестов (потоков/превдопотоков)
for (var name_i = 0; name_i < module.THREAD_COUNT; ++name_i) {
module.run_test('Я есть поток #' + name_i.toString(), test_object, status_line_elem)
}
},
}
document.addEventListener('DOMContentLoaded', module.main)
}) (this)
//]]>
</script>
</head>
<body>
<div class="page">
<h1>firefox-thread-safe-test</h1>
<p><span class="status-line-object">...</span></p>
<p>Примечание: если браузер (например Firefox) использует разные потоки для setTimeout() [а не один и тот же main loop] -- то мы увидим ошибку</p>
</div>
</body>
</html>
выполняя этот тест внутри Firefox — ошибка НЕ появится.
так что я как всегда убеждаюсь в том что критикуют Javascript именно те люди которые НЕ знают толком его.. :-)
Исправление user_id_68054, :
в ff коллбек от xhr или setTimeout выполняется в другом потоке параллельно основному, а в хроме, как положено, будет исполнено только когда основной поток прекратится. Весёлые, знаете ли, сайд-эффекты бывают.
никогда setTimeout (и xhr) НЕ не выполняется внутри параллельного потока.. ни в Firefox , ни в других браузерах... :) .. это просто было смешно предположить параллельный поток...
если в Firefox вы используете блокирующие функции — то код setTimeout выполняется внутри этих блокируюзих функциях , НО КОД НЕ ВЫПОЛНЯЕТСЯ ПАРАЛЛЕЛЬНО — НИ КОГДА (кроме как через worker)..
если не веришь — вот тебе простой тест. :)
$ cat index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>firefox-thread-safe-test</title>
<style>
/*<![CDATA[*/
body {
font-family: sans-serif;
background: white;
color: black
}
a {
color: blue;
}
.page {
margin: auto;
max-width: 1000px;
}
/*]]>*/
</style>
<script>
//<![CDATA[
(function (global) {
'use strict'
var module = global.app_main = {
THREAD_SAFE_ERROR_STR: '*** ВНИМАНИЕ!! ОБНАРУЖЕНО ЧТО БРАУЗЕР (функция setTimeout) НЕ ЯВЛЯЕТСЯ ПОТОКОБЕЗОПАСНЫМ!!! ***',
THREAD_COUNT: 100, // количество потоков [на самом деле -- лишь ПСЕВДОпотоков получаемых через setTimeout()]
THREAD_TIMEOUT: 1, // количество миллисекунд для setTimeout()
create_test_object: function () {
var test_object = {
_is_unsafe_state: false, // переменная отвечающая за НЕбезопаснось состояния
get_state: function () {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #1
alert(module.THREAD_SAFE_ERROR_STR)
return
}
return test_object._state_value
},
set_state: function (value) {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #2
alert(module.THREAD_SAFE_ERROR_STR)
return
}
test_object._is_unsafe_state = true
test_object._state_value = value
test_object._is_unsafe_state = false
},
}
return test_object
},
run_test: function (test_name, test_object, status_line_elem) {
var new_value = test_name + ': ' + Math.floor(Math.random() * 1000000).toString()
test_object.set_state(new_value)
status_line_elem.textContent = 'Обновлённое состояние: ' + new_value
if (test_object.get_state() != new_value) {
// XXX ПРОВЕРКА #3
alert(module.THREAD_SAFE_ERROR_STR)
return
}
setTimeout(function () {
module.run_test(test_name, test_object, status_line_elem)
}, module.THREAD_TIMEOUT)
},
main: function () {
var test_object = module.create_test_object()
var status_line_elem = document.querySelector('.status-line-object')
status_line_elem.innerHTML = ''
// запускает 1000 паралельных тестов (потоков/превдопотоков)
for (var name_i = 0; name_i < module.THREAD_COUNT; ++name_i) {
module.run_test('Я есть поток #' + name_i.toString(), test_object, status_line_elem)
}
},
}
document.addEventListener('DOMContentLoaded', module.main)
}) (this)
//]]>
</script>
</head>
<body>
<div class="page">
<h1>firefox-thread-safe-test</h1>
<p><span class="status-line-object">...</span></p>
<p>Примечание: если браузер (например Firefox) использует разные потоки для setTimeout() [а не один и тот же main loop] -- то мы увидим ошибку</p>
</div>
</body>
</html>
выполняя этот тест внутри Firefox — ошибка НЕ появится.
так что я как всегда убеждаюсь в том что критикуют Javascript именно те люди которые НЕ знают толком его.. :-)
Исправление user_id_68054, :
в ff коллбек от xhr или setTimeout выполняется в другом потоке параллельно основному, а в хроме, как положено, будет исполнено только когда основной поток прекратится. Весёлые, знаете ли, сайд-эффекты бывают.
никогда setTimeout (и xhr) НЕ не выполняется внутри параллельного потока.. ни в Firefox , ни в других браузерах... :) .. это просто было смешно предположить параллельный поток...
если в Firefox вы используете блокирующие функции — то код setTimeout выполняется внутри этих блокируюзих функциях , НО КОД НЕ ВЫПОЛНЯЕТСЯ ПАРАЛЛЕЛЬНО — НИ КОГДА (кроме как через worker)..
если не веришь — вот тебе простой тест. :)
$ cat index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>firefox-thread-safe-test</title>
<style>
/*<![CDATA[*/
body {
font-family: sans-serif;
background: white;
color: black
}
a {
color: blue;
}
.page {
margin: auto;
max-width: 1000px;
}
/*]]>*/
</style>
<script>
//<![CDATA[
(function (global) {
'use strict'
var module = global.app_main = {
THREAD_SAFE_ERROR_STR: '*** ВНИМАНИЕ!! ОБНАРУЖЕНО ЧТО БРАУЗЕР (функция setTimeout) НЕ ЯВЛЯЕТСЯ ПОТОКОБЕЗОПАСНЫМ!!! ***',
THREAD_COUNT: 100, // количество потоков [на самом деле -- лишь ПСЕВДОпотоков получаемых через setTimeout()]
THREAD_TIMEOUT: 1, // количество миллисекунд для setTimeout()
create_test_object: function () {
var test_object = {
_is_unsafe_state: false, // переменная отвечающая за НЕбезопаснось состояния
get_state: function () {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #1
alert(module.THREAD_SAFE_ERROR_STR)
return
}
return test_object.state_value
},
set_state: function (value) {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #2
alert(module.THREAD_SAFE_ERROR_STR)
return
}
test_object._is_unsafe_state = true
test_object.state_value = value
test_object._is_unsafe_state = false
},
}
return test_object
},
run_test: function (test_name, test_object, status_line_elem) {
var new_value = test_name + ': ' + Math.floor(Math.random() * 1000000).toString()
test_object.set_state(new_value)
status_line_elem.textContent = 'Обновлённое состояние: ' + new_value
if (test_object.get_state() != new_value) {
// XXX ПРОВЕРКА #3
alert(module.THREAD_SAFE_ERROR_STR)
return
}
setTimeout(function () {
module.run_test(test_name, test_object, status_line_elem)
}, module.THREAD_TIMEOUT)
},
main: function () {
var test_object = module.create_test_object()
var status_line_elem = document.querySelector('.status-line-object')
status_line_elem.innerHTML = ''
// запускает 1000 паралельных тестов (потоков/превдопотоков)
for (var name_i = 0; name_i < module.THREAD_COUNT; ++name_i) {
module.run_test('Я есть поток #' + name_i.toString(), test_object, status_line_elem)
}
},
}
document.addEventListener('DOMContentLoaded', module.main)
}) (this)
//]]>
</script>
</head>
<body>
<div class="page">
<h1>firefox-thread-safe-test</h1>
<p><span class="status-line-object">...</span></p>
<p>Примечание: если браузер (например Firefox) использует разные потоки для setTimeout() [а не один и тот же main loop] -- то мы увидим ошибку</p>
</div>
</body>
</html>
выполняя этот тест внутри Firefox — ошибка НЕ появится.
так что я как всегда убеждаюсь в том что критикуют Javascript именно те люди которые НЕ знают толком его.. :-)
Исправление user_id_68054, :
в ff коллбек от xhr или setTimeout выполняется в другом потоке параллельно основному, а в хроме, как положено, будет исполнено только когда основной поток прекратится. Весёлые, знаете ли, сайд-эффекты бывают.
никогда setTimeout (и xhr) НЕ не выполняется внутри параллельного потока.. ни в Firefox , ни в других браузерах... :) .. это просто было смешно предположить параллельный поток...
если в Firefox вы используете блокирующие функции — то код setTimeout выполняется внутри этих блокируюзих функциях , НО КОД НЕ ВЫПОЛНЯЕТСЯ ПАРАЛЛЕЛЬНО — НИКОГДА..
если не веришь — вот тебе простой тест. :)
$ cat index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>firefox-thread-safe-test</title>
<style>
/*<![CDATA[*/
body {
font-family: sans-serif;
background: white;
color: black
}
a {
color: blue;
}
.page {
margin: auto;
max-width: 1000px;
}
/*]]>*/
</style>
<script>
//<![CDATA[
(function (global) {
'use strict'
var module = global.app_main = {
THREAD_SAFE_ERROR_STR: '*** ВНИМАНИЕ!! ОБНАРУЖЕНО ЧТО БРАУЗЕР (функция setTimeout) НЕ ЯВЛЯЕТСЯ ПОТОКОБЕЗОПАСНЫМ!!! ***',
THREAD_COUNT: 100, // количество потоков [на самом деле -- лишь ПСЕВДОпотоков получаемых через setTimeout()]
THREAD_TIMEOUT: 1, // количество миллисекунд для setTimeout()
create_test_object: function () {
var test_object = {
_is_unsafe_state: false, // переменная отвечающая за НЕбезопаснось состояния
get_state: function () {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #1
alert(module.THREAD_SAFE_ERROR_STR)
return
}
return test_object.state_value
},
set_state: function (value) {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #2
alert(module.THREAD_SAFE_ERROR_STR)
return
}
test_object._is_unsafe_state = true
test_object.state_value = value
test_object._is_unsafe_state = false
},
}
return test_object
},
run_test: function (test_name, test_object, status_line_elem) {
var new_value = test_name + ': ' + Math.floor(Math.random() * 1000000).toString()
test_object.set_state(new_value)
status_line_elem.textContent = 'Обновлённое состояние: ' + new_value
if (test_object.get_state() != new_value) {
// XXX ПРОВЕРКА #3
alert(module.THREAD_SAFE_ERROR_STR)
return
}
setTimeout(function () {
module.run_test(test_name, test_object, status_line_elem)
}, module.THREAD_TIMEOUT)
},
main: function () {
var test_object = module.create_test_object()
var status_line_elem = document.querySelector('.status-line-object')
status_line_elem.innerHTML = ''
// запускает 1000 паралельных тестов (потоков/превдопотоков)
for (var name_i = 0; name_i < module.THREAD_COUNT; ++name_i) {
module.run_test('Я есть поток #' + name_i.toString(), test_object, status_line_elem)
}
},
}
document.addEventListener('DOMContentLoaded', module.main)
}) (this)
//]]>
</script>
</head>
<body>
<div class="page">
<h1>firefox-thread-safe-test</h1>
<p><span class="status-line-object">...</span></p>
<p>Примечание: если браузер (например Firefox) использует разные потоки для setTimeout() [а не один и тот же main loop] -- то мы увидим ошибку</p>
</div>
</body>
</html>
выполняя этот тест внутри Firefox — ошибка НЕ появится.
так что я как всегда убеждаюсь в том что критикуют Javascript именно те люди которые НЕ знают толком его.. :-)
Исходная версия user_id_68054, :
в ff коллбек от xhr или setTimeout выполняется в другом потоке параллельно основному, а в хроме, как положено, будет исполнено только когда основной поток прекратится. Весёлые, знаете ли, сайд-эффекты бывают.
никогда setTimeout (и xhr) НЕ не выполняется внутри параллельного потока.. ни в Firefox , ни в других браузерах... :) .. это просто было смешно предположить параллельный поток...
если в Firefox вы используете блокирующие функции — то код setTimeout выполняется внутри этих блокируюзих функциях , НО КОД НЕ ВЫПОЛНЯЕТСЯ ПАРАЛЛЕЛЬНО — НИКОГДА..
если не веришь — вот тебе простой тест. :)
$ cat index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>firefox-thread-safe-test</title>
<style>
/*<![CDATA[*/
body {
font-family: sans-serif;
background: white;
color: black
}
a {
color: blue;
}
.page {
margin: auto;
max-width: 1000px;
}
/*]]>*/
</style>
<script>
//<![CDATA[
(function (global) {
'use strict'
var module = global.app_main = {
THREAD_SAFE_ERROR_STR: '*** ВНИМАНИЕ!! ОБНАРУЖЕНО ЧТО БРАУЗЕР (функция setTimeout) НЕ ЯВЛЯЕТСЯ ПОТОКОБЕЗОПАСНЫМ!!! ***',
THREAD_COUNT: 100, // количество потоков [на самом деле -- лишь ПСЕВДОпотоков получаемых через setTimeout()]
THREAD_TIMEOUT: 1, // количество миллисекунд для setTimeout()
create_test_object: function () {
var test_object = {
_is_unsafe_state: false, // переменная отвечающая за НЕбезопаснось состояния
_state_value: 0, // само состояние
get_state: function () {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #1
alert(module.THREAD_SAFE_ERROR_STR)
return
}
return test_object.state_value
},
set_state: function (value) {
if (test_object._is_unsafe_state) {
// XXX ПРОВЕРКА #2
alert(module.THREAD_SAFE_ERROR_STR)
return
}
test_object._is_unsafe_state = true
test_object.state_value = value
test_object._is_unsafe_state = false
},
}
return test_object
},
run_test: function (test_name, test_object, status_line_elem) {
var new_value = test_name + ': ' + Math.floor(Math.random() * 1000000).toString()
test_object.set_state(new_value)
status_line_elem.textContent = 'Обновлённое состояние: ' + new_value
if (test_object.get_state() != new_value) {
// XXX ПРОВЕРКА #3
alert(module.THREAD_SAFE_ERROR_STR)
return
}
setTimeout(function () {
module.run_test(test_name, test_object, status_line_elem)
}, module.THREAD_TIMEOUT)
},
main: function () {
var test_object = module.create_test_object()
var status_line_elem = document.querySelector('.status-line-object')
status_line_elem.innerHTML = ''
// запускает 1000 паралельных тестов (потоков/превдопотоков)
for (var name_i = 0; name_i < module.THREAD_COUNT; ++name_i) {
module.run_test('Я есть поток #' + name_i.toString(), test_object, status_line_elem)
}
},
}
document.addEventListener('DOMContentLoaded', module.main)
}) (this)
//]]>
</script>
</head>
<body>
<div class="page">
<h1>firefox-thread-safe-test</h1>
<p><span class="status-line-object">...</span></p>
<p>Примечание: если браузер (например Firefox) использует разные потоки для setTimeout() [а не один и тот же main loop] -- то мы увидим ошибку</p>
</div>
</body>
</html>
выполняя этот тест внутри Firefox — ошибка НЕ появится.
так что я как всегда убеждаюсь в том что критикуют Javascript именно те люди которые НЕ знают толком его.. :-)