Как отработает Event loop в этой ситуации?
Подскажите, как будет вести себя event loop. Есть такой псевдокод
const ws = new WebSocket('ws://host:port'); ws.onmessage = function (data) { console.log('websocket message'); } function foo(cb) { setTimeout(cb); } foo(function () { setTimeout(function () { console.log('foo'); }); }); Предположим ситуацию, что функция foo начала свою работу, но до вызова первого setTimeout внутри функции foo по вебсокету приходит новое сообщение. Какой будет результат вывода на экран? console.log('foo'); console.log('websocket message'); //или console.log('websocket message'); console.log('foo'); |
|
Я знаю, как работает settimeout. Я спрашиваю, в каком порядке коллбеки будут поставлены в очередь event loop на обработку. Я изучал, как работает javascript внутри и догадываюсь, какой будет результат, но хочу уточнить у более опытных разработчиков на javascript.
|
xfg,
settimeout дает задержку для функции, включенной в него, и не имеет никакого влияния на onmessage, т.е. message придет независимо от состояния settimeout |
Цитата:
|
Rise, имеется ввиду, что уже началось исполнение функции foo интерпретатором и в этот момент по сети прилетает новое сообщение. Какой будет результат?
|
Dilettante_Pro, я знаю, что message придет. Вопрос был не в этом, а какой будет результат вывода на экран при условии, что в момент прихода сообщения интерпретатор уже будет выполнять функцию foo?
То есть в stack на обработке находится foo(cb) main() И в этот момент приходит сообщение. Какой будет вывод в output в результате? |
xfg,
Откройте консоль, запустите пример и быстренько кликните по окошку Кликни! <script> window.onclick= function (data) { console.log('websocket message'); } function foo(cb) { setTimeout(cb, 5000); } foo(function () { setTimeout(function () { console.log('foo'); }, 5000); }); </script> |
Цитата:
А чуть позже, когда подойдет время таймера, он положит свою задачу в очередь, далее всё то же - взятие из очереди и выполнение. Это на самый простой взгляд. А вообще у событий event-loop есть приоритеты, по которым, в частности, задачи от таймеров на последнем месте. |
Подробный лог последовательностей работы
Кликни! <script> window.onclick= function (data) { console.log('websocket message'); } function foo(cb) { console.log('foo started'); setTimeout(cb, 5000); console.log('foo ended'); } foo(function () { console.log('inner started'); setTimeout(function () { console.log('inner timeout ended'); }, 5000); console.log('inner ended'); }); </script> Функции отрабатывают мгновенно, клик никого не ждет |
Часовой пояс GMT +3, время: 05:05. |