Комментарии 20
Четыре года назад уже был перевод этой статьи от sunnybear: «Как работают таймеры в JavaScript».
Правда, там на Хабре выложена только первая часть перевода, а у Вас — полностью.
Правда, там на Хабре выложена только первая часть перевода, а у Вас — полностью.
И где картинки? Хоть бы ссылки вставили.
Можно немного дополнить Резига, указав, что при работе с интервалами при блокировке кода методами alert(), prompt(), confirm() в работе браузеров наблюдаются отличия:
Получив сообщение через 2 секунды, подождите примерно еще 2 секунды, а затем закройте сообщение. Firefox 10, IE9, Opera 12 мгновенно показывают новое сообщение. Вебкитовские Chrome и Safari ожидают 2 секунды после закрытия, т.е. в них отсчёт интервала запускается только после того, как завершится текущая функция по интервалу. Это неважно в повседневном коде, но может оказаться важным при специализированно разработке (например, очереди ядра).
setInterval(function(){
alert(1);
},2000)
Получив сообщение через 2 секунды, подождите примерно еще 2 секунды, а затем закройте сообщение. Firefox 10, IE9, Opera 12 мгновенно показывают новое сообщение. Вебкитовские Chrome и Safari ожидают 2 секунды после закрытия, т.е. в них отсчёт интервала запускается только после того, как завершится текущая функция по интервалу. Это неважно в повседневном коде, но может оказаться важным при специализированно разработке (например, очереди ядра).
Про 10мс это, вообще то, platform depended. Собственно, в windows, setTimeout и setInterval, скорее всего, напрямую используют winApi SetTimer, по крайней мере, описание работы setInterval это дословная калька с доки по SetTimer. Отсюда и все особенности их работы.
Они не используют SetTimer.
www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout — спецификация HTML5 говорит нам о 4мс. Собственно все браузеры и будут на сие ориентированны.
+ developer.mozilla.org/en/DOM/window.setTimeout — здесь еще говорится о том, что вложенные таймеры будут равны 10мс (если я правильно понял суть), но в спецификации я этого не нашел.
+ developer.mozilla.org/en/DOM/window.setTimeout — здесь еще говорится о том, что вложенные таймеры будут равны 10мс (если я правильно понял суть), но в спецификации я этого не нашел.
Еще от активной вкладки зависит, это надо тоже брать в учет, вешая какие-то фоновые каллбеки в своих веб-приложениях.
Эх и почему обычные, системные, таймеры не работают также чётко, а подвержены косякам allertable состояний :(
Хороший перевод, но ничего нового. Все это есть на русском на javascript.ru
НЛО прилетело и опубликовало эту надпись здесь
В принципе. Поведение схоже с поведением V8, так как он в самом сердце ноды, Функция process.nextTick по сути setTimeout с минимальной задержкой, т.е. как только текущая очередь выполнения освободится наступает новый «tick», событие запускается. Поразвлекайтесь с setTimeout() с задержкой в 1 мс и process.nextTick. Разница лишь в том, что nextTick будет вызваться раньше.
Запустите
на выходе получите:
Запустите
setTimeout(function(){
console.log('Hello timeout');
}, 1);
process.nextTick(function(){
console.log('Hello ticks');
})
на выходе получите:
Hello ticks
Hello timeout
Дополню для полного понимания process.nextTick добавляет вызов в самое начало очереди.
Проще представить очереди в виде книги: где каждая страница это блок синхронных вызовов. process.nextTick добавляет вызовы в начало следующей страницы:
На выходе:
Проще представить очереди в виде книги: где каждая страница это блок синхронных вызовов. process.nextTick добавляет вызовы в начало следующей страницы:
process.nextTick(function(){
console.log('Page 2. Tick #1');
})
process.nextTick(function(){
console.log('Page 2. Tick #2');
})
setTimeout(function(){ console.log('Page 2. Timeout'); }, 1);
console.log('Page 1');
На выходе:
Page 1
Page 2. Tick #1
Page 2. Tick #2
Page 2. Timeout
робот переводил?
А можно сделать время в setInterval меньше 1 мсек?
Писал дроби, но любая дробь ведет себя как единица
Писал дроби, но любая дробь ведет себя как единица
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
О том, как работают JavaScript таймеры