ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзваÑÑ ÑÑнкÑÐ¸Ñ Ð½Ðµ в даннÑй моменÑ, а позже, ÑеÑез заданнÑй инÑеÑвал вÑемени. ÐÑо назÑваеÑÑÑ Â«Ð¿Ð»Ð°Ð½Ð¸Ñование вÑзова».
ÐÐ»Ñ ÑÑого ÑÑÑеÑÑвÑÑÑ Ð´Ð²Ð° меÑода:
setTimeoutпозволÑÐµÑ Ð²ÑзваÑÑ ÑÑнкÑÐ¸Ñ Ð¾Ð´Ð¸Ð½ Ñаз ÑеÑез опÑеделÑннÑй инÑеÑвал вÑемени.setIntervalпозволÑÐµÑ Ð²ÑзÑваÑÑ ÑÑнкÑÐ¸Ñ ÑегÑлÑÑно, повÑоÑÑÑ Ð²Ñзов ÑеÑез опÑеделÑннÑй инÑеÑвал вÑемени.
ÐÑи меÑÐ¾Ð´Ñ Ð½Ðµ ÑвлÑÑÑÑÑ ÑаÑÑÑÑ ÑпеÑиÑикаÑии JavaScript. Ðо болÑÑинÑÑво ÑÑед вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ JS-кода имеÑÑ Ð²Ð½ÑÑÑенний планиÑовÑик и пÑедоÑÑавлÑÑÑ Ð´Ð¾ÑÑÑп к ÑÑим меÑодам. Ð ÑаÑÑноÑÑи, они поддеÑживаÑÑÑÑ Ð²Ð¾ вÑÐµÑ Ð±ÑаÑзеÑÐ°Ñ Ð¸ Node.js.
setTimeout
СинÑакÑиÑ:
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...);
ÐаÑамеÑÑÑ:
func|code- ФÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ ÑÑÑока кода Ð´Ð»Ñ Ð²ÑполнениÑ. ÐбÑÑно ÑÑо ÑÑнкÑиÑ. Ðо иÑÑоÑиÑеÑким пÑиÑинам можно пеÑедаÑÑ Ð¸ ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð´Ð°, но ÑÑо не ÑекомендÑеÑÑÑ.
delay- ÐадеÑжка пеÑед запÑÑком в миллиÑекÑÐ½Ð´Ð°Ñ (1000 Ð¼Ñ = 1 Ñ). ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â 0.
arg1,arg2â¦- ÐÑгÑменÑÑ, пеÑедаваемÑе в ÑÑнкÑиÑ
ÐапÑимеÑ, даннÑй код вÑзÑÐ²Ð°ÐµÑ sayHi() ÑпÑÑÑÑ Ð¾Ð´Ð½Ñ ÑекÑндÑ:
function sayHi() {
alert('ÐÑивеÑ');
}
setTimeout(sayHi, 1000);
С аÑгÑменÑами:
function sayHi(phrase, who) {
alert( phrase + ', ' + who );
}
setTimeout(sayHi, 1000, "ÐÑивеÑ", "Ðжон"); // ÐÑивеÑ, Ðжон
ÐÑли пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ ÑвлÑеÑÑÑ ÑÑÑокой, Ñо JavaScript ÑоздаÑÑ Ð¸Ð· Ð½ÐµÑ ÑÑнкÑиÑ.
ÐÑо Ñакже бÑÐ´ÐµÑ ÑабоÑаÑÑ:
setTimeout("alert('ÐÑивеÑ')", 1000);
Ðо иÑполÑзование ÑÑÑок не ÑекомендÑеÑÑÑ. ÐмеÑÑо ÑÑого иÑполÑзÑйÑе ÑÑнкÑии. ÐапÑимеÑ, Ñак:
setTimeout(() => alert('ÐÑивеÑ'), 1000);
ÐаÑинаÑÑие ÑазÑабоÑÑики иногда оÑибаÑÑÑÑ, добавлÑÑ Ñкобки () поÑле ÑÑнкÑии:
// непÑавилÑно!
setTimeout(sayHi(), 1000);
ÐÑо не ÑабоÑаеÑ, поÑÐ¾Ð¼Ñ ÑÑо setTimeout Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÑнкÑиÑ. ÐдеÑÑ sayHi() запÑÑÐºÐ°ÐµÑ Ð²Ñполнение ÑÑнкÑии, и ÑезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾ÑпÑавлÑеÑÑÑ Ð² setTimeout. РнаÑем ÑлÑÑае ÑезÑлÑÑаÑом вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ sayHi() ÑвлÑеÑÑÑ undefined (Ñак как ÑÑнкÑÐ¸Ñ Ð½Ð¸Ñего не возвÑаÑаеÑ), поÑÑÐ¾Ð¼Ñ Ð½Ð¸Ñего не планиÑÑеÑÑÑ.
ÐÑмена ÑеÑез clearTimeout
ÐÑзов setTimeout возвÑаÑÐ°ÐµÑ Â«Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑаймеÑа» timerId, коÑоÑÑй можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð´Ð°Ð»ÑнейÑего вÑполнениÑ.
СинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑменÑ:
let timerId = setTimeout(...);
clearTimeout(timerId);
Ркоде ниже планиÑÑем вÑзов ÑÑнкÑии и заÑем оÑменÑем его (пÑоÑÑо пеÑедÑмали). Ð ÑезÑлÑÑаÑе ниÑего не пÑоиÑÑ Ð¾Ð´Ð¸Ñ:
let timerId = setTimeout(() => alert("ниÑего не пÑоиÑÑ
одиÑ"), 1000);
alert(timerId); // иденÑиÑикаÑÐ¾Ñ ÑаймеÑа
clearTimeout(timerId);
alert(timerId); // ÑÐ¾Ñ Ð¶Ðµ иденÑиÑикаÑÐ¾Ñ (не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение null поÑле оÑменÑ)
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ из вÑвода alert, в бÑаÑзеÑе иденÑиÑикаÑоÑом ÑаймеÑа ÑвлÑеÑÑÑ ÑиÑло. РдÑÑгиÑ
ÑÑедаÑ
ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑо-Ñо еÑÑ. ÐапÑимеÑ, Node.js возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ ÑаймеÑа Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми меÑодами.
ÐовÑоÑÑÑÑ, ÑÑо Ð½ÐµÑ ÐµÐ´Ð¸Ð½Ð¾Ð¹ ÑпеÑиÑикаÑии на ÑÑи меÑодÑ, поÑÑÐ¾Ð¼Ñ Ñакое поведение ÑвлÑеÑÑÑ Ð½Ð¾ÑмалÑнÑм.
ÐÐ»Ñ Ð±ÑаÑзеÑов ÑаймеÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² Ñазделе ÑаймеÑов ÑÑандаÑÑа HTML5.
setInterval
ÐеÑод setInterval Ð¸Ð¼ÐµÐµÑ Ñакой же ÑинÑакÑÐ¸Ñ ÐºÐ°Ðº setTimeout:
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...);
ÐÑе аÑгÑменÑÑ Ð¸Ð¼ÐµÑÑ Ñакое же знаÑение. Ðо оÑлиÑие ÑÑого меÑода Ð¾Ñ setTimeout в Ñом, ÑÑо ÑÑнкÑÐ¸Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð½Ðµ один Ñаз, а пеÑиодиÑеÑки ÑеÑез ÑказаннÑй инÑеÑвал вÑемени.
ЧÑÐ¾Ð±Ñ Ð¾ÑÑановиÑÑ Ð´Ð°Ð»ÑнейÑее вÑполнение ÑÑнкÑии, необÑ
одимо вÑзваÑÑ clearInterval(timerId).
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ ÑообÑение каждÑе 2 ÑекÑндÑ. ЧеÑез 5 ÑекÑнд вÑвод пÑекÑаÑаеÑÑÑ:
// повÑоÑиÑÑ Ñ Ð¸Ð½ÑеÑвалом 2 ÑекÑндÑ
let timerId = setInterval(() => alert('tick'), 2000);
// оÑÑановиÑÑ Ð²Ñвод ÑеÑез 5 ÑекÑнд
setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);
alert вÑÐµÐ¼Ñ Ñоже идÑÑРболÑÑинÑÑве бÑаÑзеÑов, вклÑÑÐ°Ñ Chrome и Firefox, внÑÑÑенний ÑÑÑÑÑик пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ ÑикаÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° alert/confirm/prompt.
Так ÑÑо еÑли Ð²Ñ Ð·Ð°Ð¿ÑÑÑиÑе код вÑÑе и подождÑÑе Ñ Ð·Ð°ÐºÑÑÑием alert неÑколÑко ÑекÑнд, Ñо ÑледÑÑÑий alert бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½ ÑÑазÑ, как ÑолÑко Ð²Ñ Ð·Ð°ÐºÑоеÑе пÑедÑдÑÑий. ÐнÑеÑвал вÑемени Ð¼ÐµÐ¶Ð´Ñ ÑообÑениÑми alert бÑÐ´ÐµÑ ÐºÐ¾ÑоÑе, Ñем 2 ÑекÑндÑ.
ÐложеннÑй setTimeout
ÐÑÑÑ Ð´Ð²Ð° ÑпоÑоба запÑÑкаÑÑ ÑÑо-Ñо ÑегÑлÑÑно.
Ðдин из ниÑ
setInterval. ÐÑÑгим ÑвлÑеÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй setTimeout. ÐапÑимеÑ:
/** вмеÑÑо:
let timerId = setInterval(() => alert('tick'), 2000);
*/
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
ÐеÑод setTimeout вÑÑе планиÑÑÐµÑ ÑледÑÑÑий вÑзов пÑÑмо поÑле оконÑÐ°Ð½Ð¸Ñ ÑекÑÑего (*).
ÐложеннÑй setTimeout â более гибкий меÑод, Ñем setInterval. С его помоÑÑÑ Ð¿Ð¾ÑледÑÑÑий вÑзов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½ по-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð² завиÑимоÑÑи Ð¾Ñ ÑезÑлÑÑаÑов пÑедÑдÑÑего.
ÐапÑимеÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ напиÑаÑÑ ÑеÑвиÑ, коÑоÑÑй оÑпÑавлÑÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ð° ÑеÑÐ²ÐµÑ ÐºÐ°Ð¶Ð´Ñе 5 ÑекÑнд, но еÑли ÑеÑÐ²ÐµÑ Ð¿ÐµÑегÑÑжен, Ñо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑвелиÑиÑÑ Ð¸Ð½ÑеÑвал запÑоÑов до 10, 20, 40 ÑекÑнд⦠ÐÐ¾Ñ Ð¿Ñевдокод:
let delay = 5000;
let timerId = setTimeout(function request() {
...оÑпÑавиÑÑ Ð·Ð°Ð¿ÑоÑ...
if (оÑибка запÑоÑа из-за пеÑегÑÑзки ÑеÑвеÑа) {
// ÑвелиÑиÑÑ Ð¸Ð½ÑеÑвал Ð´Ð»Ñ ÑледÑÑÑего запÑоÑа
delay *= 2;
}
timerId = setTimeout(request, delay);
}, delay);
РеÑли ÑÑнкÑии, коÑоÑÑе Ð¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÑем, ÑеÑÑÑÑоÑмкие и ÑÑебÑÑÑ Ð²Ñемени, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ измеÑиÑÑ Ð²ÑемÑ, заÑÑаÑенное на вÑполнение, и ÑпланиÑоваÑÑ ÑледÑÑÑий вÑзов ÑанÑÑе или позже.
ÐложеннÑй setTimeout позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¼ÐµÐ¶Ð´Ñ Ð²ÑполнениÑми более ÑоÑно, Ñем setInterval.
СÑавним два ÑÑагменÑа кода. ÐеÑвÑй иÑполÑзÑÐµÑ setInterval:
let i = 1;
setInterval(function() {
func(i);
}, 100);
ÐÑоÑой иÑполÑзÑÐµÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй setTimeout:
let i = 1;
setTimeout(function run() {
func(i);
setTimeout(run, 100);
}, 100);
ÐÐ»Ñ setInterval внÑÑÑенний планиÑовÑик бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ func(i) каждÑе 100 мÑ:
ÐбÑаÑили внимание?
РеалÑÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑжка Ð¼ÐµÐ¶Ð´Ñ Ð²Ñзовами func Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ setInterval менÑÑе, Ñем Ñказано в коде!
ÐÑо ноÑмалÑно, поÑÐ¾Ð¼Ñ ÑÑо вÑемÑ, заÑÑаÑенное на вÑполнение func, иÑполÑзÑÐµÑ ÑаÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ инÑеÑвала вÑемени.
Ðполне возможно, ÑÑо вÑполнение func бÑÐ´ÐµÑ Ð´Ð¾Ð»ÑÑе, Ñем Ð¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð»Ð¸, и займÑÑ Ð±Ð¾Ð»ÐµÐµ 100 мÑ.
Рданном ÑлÑÑае движок ждÑÑ Ð¾ÐºÐ¾Ð½ÑÐ°Ð½Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ func и заÑем пÑовеÑÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик и, еÑли вÑÐµÐ¼Ñ Ð¸ÑÑекло, немедленно запÑÑÐºÐ°ÐµÑ ÐµÐ³Ð¾ Ñнова.
РкÑайнем ÑлÑÑае, еÑли ÑÑнкÑÐ¸Ñ Ð²Ñегда вÑполнÑеÑÑÑ Ð´Ð¾Ð»ÑÑе, Ñем задеÑжка delay, Ñо вÑÐ·Ð¾Ð²Ñ Ð±ÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð±ÐµÐ· задеÑжек вообÑе.
Ðиже пÑедÑÑавлено изобÑажение, показÑваÑÑее пÑоÑеÑÑ ÑабоÑÑ ÑекÑÑÑивного setTimeout:
ÐложеннÑйsetTimeout гаÑанÑиÑÑÐµÑ ÑикÑиÑованнÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ (здеÑÑ 100 мÑ).
ÐÑо поÑомÑ, ÑÑо новÑй вÑзов планиÑÑеÑÑÑ Ð² конÑе пÑедÑдÑÑего.
Ðогда ÑÑнкÑÐ¸Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² setInterval/setTimeout, на Ð½ÐµÑ ÑоздаÑÑÑÑ Ð²Ð½ÑÑÑеннÑÑ ÑÑÑлка и ÑоÑ
ÑанÑеÑÑÑ Ð² планиÑовÑике. ÐÑо пÑедоÑвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ðµ ÑÑнкÑии в ÑбоÑÑик мÑÑоÑа, даже еÑли на Ð½ÐµÑ Ð½ÐµÑ Ð´ÑÑгиÑ
ÑÑÑлок.
// ÑÑнкÑÐ¸Ñ Ð¾ÑÑаÑÑÑÑ Ð² памÑÑи до ÑеÑ
поÑ, пока планиÑовÑик обÑаÑаеÑÑÑ Ðº ней
setTimeout(function() {...}, 100);
ÐÐ»Ñ setInterval ÑÑнкÑÐ¸Ñ Ð¾ÑÑаÑÑÑÑ Ð² памÑÑи до ÑеÑ
поÑ, пока не бÑÐ´ÐµÑ Ð²Ñзван clearInterval.
ÐÑÑÑ Ð¸ побоÑнÑй ÑÑÑекÑ. ФÑнкÑÐ¸Ñ ÑÑÑлаеÑÑÑ Ð½Ð° внеÑнее лекÑиÑеÑкое окÑÑжение, поÑÑÐ¾Ð¼Ñ Ð¿Ð¾ÐºÐ° она ÑÑÑеÑÑвÑеÑ, внеÑние пеÑеменнÑе ÑÑÑеÑÑвÑÑÑ Ñоже. Ðни могÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð±Ð¾Ð»ÑÑе памÑÑи, Ñем Ñама ÑÑнкÑиÑ. ÐоÑÑомÑ, еÑли ÑегÑлÑÑнÑй вÑзов ÑÑнкÑии болÑÑе не нÑжен, Ñо лÑÑÑе оÑмениÑÑ ÐµÐ³Ð¾, даже еÑли ÑÑнкÑÐ¸Ñ Ð¾ÑÐµÐ½Ñ Ð¼Ð°Ð»ÐµÐ½ÑкаÑ.
setTimeout Ñ Ð½Ñлевой задеÑжкой
ÐÑобÑй ваÑÐ¸Ð°Ð½Ñ Ð¸ÑполÑзованиÑ: setTimeout(func, 0) или пÑоÑÑо setTimeout(func).
ÐÑо планиÑÑÐµÑ Ð²Ñзов func наÑÑолÑко бÑÑÑÑо, наÑколÑко ÑÑо возможно. Ðо планиÑовÑик бÑÐ´ÐµÑ Ð²ÑзÑваÑÑ ÑÑнкÑÐ¸Ñ ÑолÑко поÑле завеÑÑÐµÐ½Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑÑего кода.
Так вÑзов ÑÑнкÑии бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð»Ð°Ð½Ð¸Ñован ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑÑего кода.
ÐапÑимеÑ, ÑÑÐ¾Ñ ÐºÐ¾Ð´ вÑÐ²Ð¾Ð´Ð¸Ñ Â«ÐÑивеÑ» и заÑем ÑÑÐ°Ð·Ñ Â«ÐиÑ»:
setTimeout(() => alert("ÐиÑ"));
alert("ÐÑивеÑ");
ÐеÑÐ²Ð°Ñ ÑÑÑока помеÑÐ°ÐµÑ Ð²Ñзов в «календаÑÑ» ÑеÑез 0 мÑ. Ðо планиÑовÑик пÑовеÑÐ¸Ñ Â«ÐºÐ°Ð»ÐµÐ½Ð´Ð°ÑÑ» ÑолÑко поÑле Ñого, как ÑекÑÑий код завеÑÑиÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ "ÐÑивеÑ" вÑводиÑÑÑ Ð¿ÐµÑвÑм, а "ÐиÑ" â поÑле него.
ÐÑÑÑ Ð¸ более пÑодвинÑÑÑе ÑлÑÑаи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ñлевой задеÑжки в бÑаÑзеÑÐ°Ñ , коÑоÑÑе Ð¼Ñ ÑаÑÑмоÑÑим в главе СобÑÑийнÑй Ñикл: микÑозадаÑи и макÑозадаÑи.
РбÑаÑзеÑе еÑÑÑ Ð¾Ð³ÑаниÑение на Ñо, как ÑаÑÑо внÑÑÑенние ÑÑÑÑÑики могÑÑ Ð²ÑполнÑÑÑÑÑ. Ð ÑÑандаÑÑе HTML5 говоÑиÑÑÑ: «поÑле пÑÑи вложеннÑÑ ÑаймеÑов инÑеÑвал должен ÑоÑÑавлÑÑÑ Ð½Ðµ менее ÑеÑÑÑÑÑ Ð¼Ð¸Ð»Ð»Ð¸ÑекÑнд.».
ÐÑодемонÑÑÑиÑÑем в пÑимеÑе ниже, ÑÑо ÑÑо ознаÑаеÑ. ÐÑзов setTimeout повÑоÑно вÑзÑÐ²Ð°ÐµÑ ÑÐµÐ±Ñ ÑеÑез 0 мÑ. ÐаждÑй вÑзов Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ ÑеалÑное вÑÐµÐ¼Ñ Ð¾Ñ Ð¿ÑедÑдÑÑего вÑзова в маÑÑиве times. Ðакова ÑеалÑÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑжка? ÐоÑмоÑÑим:
let start = Date.now();
let times = [];
setTimeout(function run() {
times.push(Date.now() - start); // запоминаем задеÑÐ¶ÐºÑ Ð¾Ñ Ð¿ÑедÑдÑÑего вÑзова
if (start + 100 < Date.now()) alert(times); // показÑваем задеÑÐ¶ÐºÑ ÑеÑез 100 мÑ
else setTimeout(run); // еÑли нÑжно еÑÑ Ð·Ð°Ð¿Ð»Ð°Ð½Ð¸ÑоваÑÑ
});
// пÑÐ¸Ð¼ÐµÑ Ð²Ñвода:
// 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100
ÐеÑвÑй ÑÐ°Ð¹Ð¼ÐµÑ Ð·Ð°Ð¿ÑÑкаеÑÑÑ ÑÑÐ°Ð·Ñ (как и Ñказано в ÑпеÑиÑикаÑии), а заÑем задеÑжка вÑÑÑÐ¿Ð°ÐµÑ Ð² игÑÑ, и Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ 9, 15, 20, 24....
ÐналогиÑное пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи иÑполÑзовании setInterval вмеÑÑо setTimeout: setInterval(f) запÑÑÐºÐ°ÐµÑ f неÑколÑко Ñаз Ñ Ð½Ñлевой задеÑжкой, а заÑем Ñ Ð·Ð°Ð´ÐµÑжкой 4+ мÑ.
ÐÑо огÑаниÑение ÑÑÑеÑÑвÑÐµÑ Ð´Ð°Ð²Ð½Ð¾, многие ÑкÑипÑÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ Ð½Ð° него, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ ÑÐ¾Ñ ÑанÑеÑÑÑ Ð¿Ð¾ иÑÑоÑиÑеÑким пÑиÑинам.
ÐÑого огÑаниÑÐµÐ½Ð¸Ñ Ð½ÐµÑ Ð² ÑеÑвеÑном JavaScript. Там еÑÑÑ Ð¸ дÑÑгие ÑпоÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ Ð·Ð°Ð´Ð°Ñ. ÐапÑимеÑ, setImmediate Ð´Ð»Ñ Node.js. Так ÑÑо ÑÑо огÑаниÑение оÑноÑиÑÑÑ ÑолÑко к бÑаÑзеÑам.
ÐÑого
- ÐеÑодÑ
setInterval(func, delay, ...args)иsetTimeout(func, delay, ...args)позволÑÑÑ Ð²ÑполнÑÑÑfuncÑегÑлÑÑно или ÑолÑко один Ñаз поÑле задеÑжкиdelay, заданной в мÑ. - ÐÐ»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимо вÑзваÑÑ
clearInterval/clearTimeoutÑо знаÑением, коÑоÑое возвÑаÑаÑÑ Ð¼ÐµÑодÑsetInterval/setTimeout. - ÐложеннÑй вÑзов
setTimeoutÑвлÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ гибкой алÑÑеÑнаÑивойsetInterval. Также он позволÑÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑно задаÑÑ Ð¸Ð½ÑеÑвал Ð¼ÐµÐ¶Ð´Ñ Ð²ÑполнениÑми. - ÐланиÑование Ñ Ð½Ñлевой задеÑжкой
setTimeout(func,0)или, ÑÑо Ñо же Ñамое,setTimeout(func)иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²Ñзовов, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ ÐºÐ°Ðº можно ÑкоÑее, поÑле завеÑÑÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑÑего кода. - ÐÑаÑÐ·ÐµÑ Ð¾Ð³ÑаниÑÐ¸Ð²Ð°ÐµÑ 4-Ð¼Ñ Ð¼Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑÑÑÑ Ð¸ более вложеннÑми вÑзовами
setTimeout, а Ñакже длÑsetInterval, наÑÐ¸Ð½Ð°Ñ Ñ 5-го вÑзова.
ÐбÑаÑим внимание, ÑÑо вÑе меÑÐ¾Ð´Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ гаÑанÑиÑÑÑÑ ÑоÑнÑÑ Ð·Ð°Ð´ÐµÑжкÑ.
ÐапÑимеÑ, ÑÐ°Ð¹Ð¼ÐµÑ Ð² бÑаÑзеÑе Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ´Ð»ÑÑÑÑÑ Ð¿Ð¾ многим пÑиÑинам:
- ÐеÑегÑÑжен пÑоÑеÑÑоÑ.
- Ðкладка бÑаÑзеÑа в Ñоновом Ñежиме.
- РабоÑа ноÑÑбÑка Ð¾Ñ Ð°ÐºÐºÑмÑлÑÑоÑа.
ÐÑÑ ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиваÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑй инÑеÑвал ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑаймеÑа (и минималÑнÑÑ Ð·Ð°Ð´ÐµÑжкÑ) до 300 или даже 1000 Ð¼Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ð±ÑаÑзеÑа и наÑÑÑоек пÑоизводиÑелÑноÑÑи ÐС.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)