Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Эффект setTimeout (https://javascript.ru/forum/misc/50217-ehffekt-settimeout.html)

diesel_boy 17.09.2014 10:37

Эффект 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.

MallSerg 17.09.2014 10:44

JS однопоточен по определению setTimeout не может наступить пока исполняется любой JS на этой странице
события выстраиваются и ждут завершения JS и только после этого события наступают

tsigel 17.09.2014 10:47

Цитата:

setTimeout() выполняется только после выхода из основного потока программы
Совершенно верно. Это означает что то что в сет таймауте выполнится после выполнения всех действий данного потока. То есть если это функция, то аосле функции (ну и всего калл стека если он есть). Чтобы результат был таким каким вы его описали программа должна была остановиться между выполнением строк кода, а она этого сделать не может. Нельзя прервать выполнение синхронных строк кода.

diesel_boy 17.09.2014 10:49

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

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

Цитата:

setTimeout размещает своего рода заявку на отложенный вызов, по сути он ждет ивента что время нужное наступило и только тогда запускает функцию.
Аналогичный вопрос на toster'е
Описание модели исполнения асинхронных (конкурирующих) блоков

petya 18.09.2014 00:21

Цитата:

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

ИМХО, это не совсем верно. Он дожидается этого ивента, а затем ставит в очередь функцию.


Часовой пояс GMT +3, время: 06:19.