Чи є різниця?
Так. Час очікування виконує певний час після виклику setTimeout (); Інтервал виконує певний час після звільнення попереднього інтервалу.
Ви помітите різницю, якщо ваша функція doStuff () потребує певного часу. Наприклад, якщо ми представляємо виклик setTimeout / setInterval з .
, *
запуск тайм-ауту / інтервалу та виконання коду JavaScript [-----]
, терміни виглядають так:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Наступне ускладнення - якщо запускається інтервал, в той час як JavaScript вже зайнятий тим, що робить щось (наприклад, обробка попереднього інтервалу). У цьому випадку інтервал запам'ятовується і відбувається, як тільки попередній обробник закінчується і повертає керування браузеру. Так, наприклад, для процесу doStuff (), який іноді короткий ([-]), а іноді довгий ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• представляє інтервал стрільби, який не міг виконати свій код відразу, і був зроблений на очікуванні.
Тому інтервали намагаються "наздогнати", щоб повернутися до розкладу. Але вони не стоять у черзі одна на одну: може бути лише одне виконання, яке очікує на інтервал. (Якщо всі вони стоять у черзі, у браузера залишиться постійно зростаючий список невиконаних страт!)
. * • • x • • x
[------][------][------][------]
x являє собою інтервал стрільби, який не вдалося виконати або зробити очікуваним, тому замість цього було відкинуто.
Якщо функція doStuff () зазвичай виконує більше часу, ніж інтервал, встановлений для неї, браузер з'їсть 100% ЦП, намагаючись її обслуговувати, і може стати менш чуйним.
Що ви використовуєте і чому?
Chained-Timeout надає гарантоване місце вільного часу для браузера; Interval намагається забезпечити виконання функції, яку вона виконує максимально наближеною до запланованого часу, за рахунок доступності інтерфейсу браузера.
Я вважаю, що інтервал для одноразових анімацій, який я хотів би бути максимально рівним, в той час як приковані тайм-аути є більш ввічливими для анімації, що триває, яка буде тривати весь час, поки сторінка завантажується. Для менш вимогливих застосувань (наприклад, тривіального оновлення, що стріляє кожні 30 секунд чи що-небудь), ви можете сміливо використовувати будь-яке.
Що стосується сумісності браузера, setTimeout передує setInterval, але всі браузери, яких ви зустрінете сьогодні, підтримують і те, і інше. Останнім страггелером протягом багатьох років був IE Mobile у WinMo <6,5, але, сподіваємось, це теж зараз за нами.