Javascript.RU

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

Эффект setTimeout
Добрый день уважаемые участники форума.

Скорей всего это где - то кем - то уже описано, но я не смог найти (правильнее сказать не смог понять как спросить google) описание следующего эффекта.

Эффект.
setTimeout() выполняется только после выхода из основного потока программы, и вот как я это понял:

setTimeout(function() {
      console.log("x1");
     }, 1);

   setTimeout(function() {
      console.log("x2");
     }, 1);

   console.log("X3");

   for (var i=0,x=45; i<1000000000;i++) { x=x/5*5; }
   console.log("X4");


Я ожидал что в консоль будет выведено:
x3
x1
x2
x4

На деле выводится:
x3
*пауза, ждём вычисления*
x4
x1
x2

Вопрос стандартный: с чего бы это?

Буду очень благодарен за простое объяснение этого эффекта и будут приятным бонусом ссылки на rtfm.
Ответить с цитированием
  #2 (permalink)  
Старый 17.09.2014, 10:44
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

JS однопоточен по определению setTimeout не может наступить пока исполняется любой JS на этой странице
события выстраиваются и ждут завершения JS и только после этого события наступают
Ответить с цитированием
  #3 (permalink)  
Старый 17.09.2014, 10:47
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Цитата:
setTimeout() выполняется только после выхода из основного потока программы
Совершенно верно. Это означает что то что в сет таймауте выполнится после выполнения всех действий данного потока. То есть если это функция, то аосле функции (ну и всего калл стека если он есть). Чтобы результат был таким каким вы его описали программа должна была остановиться между выполнением строк кода, а она этого сделать не может. Нельзя прервать выполнение синхронных строк кода.
Ответить с цитированием
  #4 (permalink)  
Старый 17.09.2014, 10:49
Новичок на форуме
Отправить личное сообщение для diesel_boy Посмотреть профиль Найти все сообщения от diesel_boy
 
Регистрация: 17.09.2014
Сообщений: 2

Спасибо за внимание, я тутже нашёл ответ на свой же вопрос, уважаемые модераторы, можете без зазрения совести удалять эту ветку.

На случай сохранения треда вот ссылки на ответ:

Цитата:
setTimeout размещает своего рода заявку на отложенный вызов, по сути он ждет ивента что время нужное наступило и только тогда запускает функцию.
Аналогичный вопрос на toster'е
Описание модели исполнения асинхронных (конкурирующих) блоков
Ответить с цитированием
  #5 (permalink)  
Старый 18.09.2014, 00:21
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

Сообщение от diesel_boy
setTimeout размещает своего рода заявку на отложенный вызов, по сути он ждет ивента что время нужное наступило и только тогда запускает функцию.
ИМХО, это не совсем верно. Он дожидается этого ивента, а затем ставит в очередь функцию.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout как он работает??? namo86 Общие вопросы Javascript 16 02.02.2011 09:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02
setTimeout Воитель Общие вопросы Javascript 5 23.01.2009 10:36
эффект ленты HelpeR Общие вопросы Javascript 8 08.01.2009 11:41