Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.09.2016, 22:55
xfg xfg вне форума
Новичок на форуме
Отправить личное сообщение для xfg Посмотреть профиль Найти все сообщения от xfg
 
Регистрация: 14.09.2016
Сообщений: 6

Как отработает 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');
Ответить с цитированием
  #2 (permalink)  
Старый 15.09.2016, 10:38
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

xfg,
информация к размышлению
http://javascript.ru/settimeout
Ответить с цитированием
  #3 (permalink)  
Старый 15.09.2016, 11:33
xfg xfg вне форума
Новичок на форуме
Отправить личное сообщение для xfg Посмотреть профиль Найти все сообщения от xfg
 
Регистрация: 14.09.2016
Сообщений: 6

Я знаю, как работает settimeout. Я спрашиваю, в каком порядке коллбеки будут поставлены в очередь event loop на обработку. Я изучал, как работает javascript внутри и догадываюсь, какой будет результат, но хочу уточнить у более опытных разработчиков на javascript.
Ответить с цитированием
  #4 (permalink)  
Старый 15.09.2016, 13:25
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

xfg,
settimeout дает задержку для функции, включенной в него, и не имеет никакого влияния на onmessage, т.е. message придет независимо от состояния settimeout
Ответить с цитированием
  #5 (permalink)  
Старый 15.09.2016, 20:39
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от xfg
внутри функции foo по вебсокету приходит
Где в твоем псевдокоде это отражено?
Ответить с цитированием
  #6 (permalink)  
Старый 15.09.2016, 22:26
xfg xfg вне форума
Новичок на форуме
Отправить личное сообщение для xfg Посмотреть профиль Найти все сообщения от xfg
 
Регистрация: 14.09.2016
Сообщений: 6

Rise, имеется ввиду, что уже началось исполнение функции foo интерпретатором и в этот момент по сети прилетает новое сообщение. Какой будет результат?
Ответить с цитированием
  #7 (permalink)  
Старый 15.09.2016, 22:34
xfg xfg вне форума
Новичок на форуме
Отправить личное сообщение для xfg Посмотреть профиль Найти все сообщения от xfg
 
Регистрация: 14.09.2016
Сообщений: 6

Dilettante_Pro, я знаю, что message придет. Вопрос был не в этом, а какой будет результат вывода на экран при условии, что в момент прихода сообщения интерпретатор уже будет выполнять функцию foo?

То есть в stack на обработке находится

foo(cb)
main()

И в этот момент приходит сообщение. Какой будет вывод в output в результате?
Ответить с цитированием
  #8 (permalink)  
Старый 16.09.2016, 11:22
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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>

Последний раз редактировалось Dilettante_Pro, 16.09.2016 в 13:38.
Ответить с цитированием
  #9 (permalink)  
Старый 16.09.2016, 22:18
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от xfg Посмотреть сообщение
Dilettante_Pro, я знаю, что message придет. Вопрос был не в этом, а какой будет результат вывода на экран при условии, что в момент прихода сообщения интерпретатор уже будет выполнять функцию foo?

То есть в stack на обработке находится

foo(cb)
main()

И в этот момент приходит сообщение. Какой будет вывод в output в результате?
когда придет сообщение, в event-loop добавится задача по вызову колбэка onmessage. Эта задача дождется, когда функция foo закончит свою работу (по созданию таймера), и будет взята из очереди и выполнена, с выводом 'websocket message'.

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

Это на самый простой взгляд. А вообще у событий event-loop есть приоритеты, по которым, в частности, задачи от таймеров на последнем месте.
Ответить с цитированием
  #10 (permalink)  
Старый 19.09.2016, 10:22
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Подробный лог последовательностей работы
Кликни!
<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>

Функции отрабатывают мгновенно, клик никого не ждет

Последний раз редактировалось Dilettante_Pro, 19.09.2016 в 10:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать event, эмулирующий enter Artanis Events/DOM/Window 7 16.07.2019 06:40
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Подскажите как быть в данной ситуации Saffoniy Общие вопросы Javascript 9 10.01.2013 01:37