Fark var mı?
Evet. Bir Timeout, setTimeout () çağrıldıktan sonra belirli bir süre çalıştırır; bir Aralık, önceki aralık tetiklendikten sonra belirli bir süre çalıştırır.
DoStuff () işlevinizin yürütülmesi biraz zaman alıyorsa, farkı göreceksiniz. Örneğin, setTimeout / setInterval ile bir çağrıyı temsil edersek .
, zaman aşımı / aralığının *
ve ile JavaScript kodunun çalıştırılmasını [-----]
tetiklersek, zaman çizelgeleri şöyle görünür:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Bir sonraki zorluk, JavaScript zaten bir şey yapmakla meşgulken (önceki bir aralığı işlemek gibi) bir aralık tetiklenmesidir. Bu durumda, aralık hatırlanır ve önceki işleyici bittiğinde ve denetimi tarayıcıya geri döndürdüğünde gerçekleşir. Örneğin, bazen kısa ([-]) ve bazen uzun ([-----]) bir doStuff () işlemi için:
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• kodunu hemen yürütemeyen ve bunun yerine beklemede olan bir aralık tetiklemeyi temsil eder.
Bu yüzden aralıklar programa geri dönmek için 'yakalamaya' çalışır. Ancak, birbiri üzerinde sıraya girmezler: aralık başına yalnızca bir yürütme olabilir. (Hepsi sıraya alınırsa, tarayıcı sürekli genişleyen olağanüstü yürütme listesiyle bırakılır!)
. * • • x • • x
[------][------][------][------]
x, yürütülemeyen veya beklemede yapılamayan bir aralık tetiklemesini temsil eder, bunun yerine atılır.
DoStuff () işlevinizin yürütülmesi alışılmış şekilde ayarlanan aralıktan daha uzun sürerse, tarayıcı hizmet vermeye çalışırken% 100 CPU tüketir ve daha az yanıt verebilir.
Hangisini kullanıyorsunuz ve neden?
Zincirleme Zaman Aşımı tarayıcıya garantili bir boş zaman aralığı sağlar; Aralık, çalıştırdığı işlevin, tarayıcı kullanıcı arabirimi kullanılabilirliği pahasına, planlanan zamanlarına mümkün olduğunca yakın yürütülmesini sağlamaya çalışır.
Zincirleme zaman aşımları sayfa yüklenirken her zaman gerçekleşecek olan animasyonlar için daha nazikken, bir kerelik animasyonlar için olabildiğince düzgün olmasını istediğim bir aralık düşünürdüm. Daha az zorlu kullanımlar için (her 30 saniyede bir ateş eden önemsiz bir güncelleyici gibi), ikisini de güvenle kullanabilirsiniz.
Tarayıcı uyumluluğu açısından, setTimeout setInterval'dan önce gelir, ancak bugün karşılaşacağınız tüm tarayıcılar her ikisini de destekler. Uzun yıllar boyunca son straggler WinMo <6.5 IE Mobil oldu, ama umarım bu da şimdi geride.