Задать вопрос
bezrukovPS
@bezrukovPS
Ведущий программист 1С-Битрикс

Как работает асинхронный javascript, в частности setTimeout ?

Добрый день.
Расскажите пожалуйста как работает setTimeout(function, 0).

Раньше я где-то читал он откладывает выполнение function до конца выполнения функции в которой вызывался,
но сейчас у меня такое чувство что он выполняется после выполнения всего стека действий, независимо в какой функции определён.
(fucntion(){
console.log(1);
setTimeout(function(){console.log(2);},0)
console.log(3);
})()
console.log(4);

вернёт 1,3,4,2.

Хотелось бы чуть больше ясности, возможно теоретики!:)
Заранее большое спасибо!:)
  • Вопрос задан
  • 5466 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
У вас один процесс/поток (с опереденными допущениям) для выполнения всего этого. В один момент времени может делаться что-то одно (только webworkers могут работать паралельно с основным кодом). Движок JS мультиплексирует выполнение кода.

setTimeout размещает своего рода заявку на отложенный вызов, по сути он ждет ивента что время нужное наступило и только тогда запускает функцию. Пока этот ивент не произошел, выполняется весь нижестоящий код. Если нижестоящий код блокирует выполнение нашего события, то может случиться ситуация при которой событие наступает позже ожидаемого времени. Именно по этому следует избегать подобного кода и все тежелые вычисления ложить в setTimeout/webworkers. Так что вот такой код:
var start = Date.now();
setTimeout(function () {
    console.log('~0 ms should pass, %d ms really pass', Date.now() - start);
}, 0);
while(Date.now() - start < 500) {
    // loop for 0.5 sec
}
console.log('%d ms pass', Date.now() - start);


выведет:
500 ms pass 
~0 ms should pass, 501 ms really pass


Для более глубокого понимания стоит почитать про Event Loop.
Ответ написан
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Вот стандарт про event loop, tasks & microtasks.
Можно почитать статью о том, как работают JavaScript таймеры.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
RubaXa
@RubaXa
setTimeout «просто» выполняет функцию через определенный промежуток времени и никак не зависит от контекста исполнения.
Ответ написан
Комментировать
qmax
@qmax
программер
Если вам зачем-то нужно знать порядок выполнения асинхронных вызовов - вы копаете совершенно не в ту сторону.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы