LINUX.ORG.RU

История изменений

Исправление 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 именно те люди которые НЕ знают толком его.. :-)