Барьерная синхронизация для ассинхронных процессов JS
Красиво называется да? Вот не могу разобраться.
Простейший вид через переменную в общей памяти . Поробывал вот так например : <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript"> var TimeOut = 3; function testTimeout() { setInterval(function () { TimeOut--; alert('1 секундa' + TimeOut); }, 1000); while (TimeOut > 0) { } } </script> </head> <body> <p style="text-align: center" onclick='testTimeout()'><button>SetInterval falls into enless loop</button> </p> </body> </html> Но не получается цикл while (TimeOut > 0) { } почему-то бесконечный, хотя по моей логике , раз в секунду TimeOut должен уменьшаться на единицу непонимаю как работает этот планировщик отложенных вызовов, почему код уменьшающий TimeOut не выполняется. Может надо как-то протолкнуть эту очередь отложенных вызовов , может она передает управление другой процедуре когда есть свободное время . Типа Application->ProcessMessages/ Нашёл какойто метод document.dispatchEvent() может это оно |
В js асинхронность виртуальная. Все события возникающие по таймеру или в ответ на действия пользователя ставятся в очередь после завершения текущего непрерываемого блока кода. Циклы в js относится к таким непрерываемым блокам, пока цикл не закончится ни одно событие или таймер не сработает.
|
:) Понятно .
А где про это можно почитать если не трудно наведите пожалуйста. А то иногда хочется ассинхронные функции превратить в синхронные. |
Этим способом лучше не пользоваться, ибо цикл вешает браузер на время выполнения.
Но если всё-таки и прибегают к такому способу, то просто проверяют время внутри цикла. <script type="text/javascript"> document.write(new Date()); for(var end = 1000 + +new Date(); new Date()<end;){} document.write(new Date()); </script> |
Цитата:
|
Часовой пояс GMT +3, время: 09:03. |