2016-06-20 1 views
2

Я изо всех сил пытаюсь представить пример использования в разработке веб-приложений, которому необходимо использовать setInterval.Используется для setInterval, который не может быть достигнут с помощью setTimeout или RAF?

«Опасность» с setInterval заключается в том, что он просто ставит очередь на обратные вызовы, если один из них не завершен в течение выделенного интервала.

Кроме того, поведение setInterval может быть смоделировано с помощью setTimeout или requestAnimationFrame без этой «опасности».

Учитывая это, может ли кто-нибудь предоставить мне прецедент, где setInterval является лучшим/более подходящим вариантом?

Edit:

думал, что я записывал свои выводы.

setInterval - это простой способ, чтобы что-то работало с интервалами равномерного. Интервалы будут в основном достаточно точными, но если цикл событий заблокирован, они могут быть полностью неточными.

var x = 0; 
 
setInterval(function() { 
 
    waitBlocking(5000); 
 
    document.write(x++); 
 
},100); 
 

 
function waitBlocking(ms) { 
 
    var start = Date.now(); 
 
    while((Date.now() - start) < ms) {} 
 
}

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

Уверен, что у меня что-то не хватает.

Edit 2:

В основном это наилучшее приближение часов JS можно достичь, так что я думаю setInterval это «таймер часы». Предположительно, это было полезно в приложениях, которым нужны простые часы.

+2

Я бы не согласился с тем, что эта функциональность является «опасностью» для 'setInterval'; это особая функция и полезна в ситуациях, когда вы хотите, чтобы ваши обратные вызовы выполнялись по определенному графику, который не зависит от того, как долго выполняется обратный вызов для выполнения. – Hamms

+0

Будучи однопоточным, он не является независимым, но я принимаю ваше решение. – Ben

+1

«то, что он просто ставит очередь на обратные вызовы, если он не завершен в течение выделенного интервала». --- Это не совсем так. В очереди поставлен только один дополнительный вызов. Преимущество 'setInterval' в том, что вам не нужно вручную управлять следующим вызовом (иначе вы испортите свой код для домена с настройкой' setTimeout'). Нельзя сказать, что не всегда это анонимная функция, которую вы можете легко взломать, а ссылку на функцию из переменной. – zerkms

ответ

1

Предполагаемый случай, когда setTnterval подходит, когда вы хотите выполнить функцию в точное время. setInterval и setTimeout имеет различия в подзаголовках. setInterval выполнить функцию после задержки, начиная с момента, когда превалирует setInterval. setInterval также не является затворником, поэтому нет страха замыканий и утечек памяти. Более подробную информацию можно однако найти here

Ниже приведен код для типичного setInterval функции

var intervalID = window.setInterval(myCallback, 500); 

function myCallback() { 
    // Your code here 
} 

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

function startTimer() { 
    var count = [1,2,3,4,5,6,7,8,9,0] 
    setTimeout(function() { 
     //do some stuff 
     count.push(100);//you have just create a closure 
     //and all the problems that is associated with it 
     startTimer();//this is where the recursion happens 
    }, 1000); 
} 
+0

Я думал об одном и том же ответе, но потом я посмотрел профиль Бена, он имеет репутацию 11k, он консультант Javascript, он написал много javascript статей на Medium и понял, что, вероятно, он ищет более прагматичный ответ :) Подождите! Какие? Я не сталкер ... –

+1

Хорошо, спасибо за подсказку, позвольте мне включить некоторые коды, чтобы лучше проиллюстрировать мой ответ – spirit