Ðи можемо виÑÑÑиÑи виконаÑи ÑÑнкÑÑÑ Ð½Ðµ заÑаз, а ÑеÑез певний ÑÐ°Ñ Ð¿ÑзнÑÑе. Це називаÑÑÑÑÑ âпланÑÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑâ.
ÐÐ»Ñ ÑÑого ÑÑнÑÑ Ð´Ð²Ð° меÑоди:
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 повеÑÑÐ°Ñ Ð¾Ð±âÑÐºÑ ÑаймеÑа з додаÑковими меÑодами.
ÐÐ½Ð¾Ð²Ñ Ð¶ Ñаки, Ð½ÐµÐ¼Ð°Ñ Ð·Ð°Ð³Ð°Ð»ÑÐ½Ð¾Ñ ÑпеÑиÑÑкаÑÑÑ Ð´Ð»Ñ ÑÐ¸Ñ Ð¼ÐµÑодÑв, ÑÐ¾Ð¼Ñ Ñе ноÑмалÑно.
ÐÐ»Ñ Ð±ÑаÑзеÑÑв ÑаймеÑи опиÑÐ°Ð½Ñ Ð² ÑоздÑÐ»Ñ ÑаймеÑÑв ÑÑандаÑÑÑ HTML Living Standard.
setInterval
ÐеÑод setInterval Ð¼Ð°Ñ Ñой Ñамий ÑинÑакÑиÑ, Ñо Ñ setTimeout:
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
УÑÑ Ð°ÑгÑменÑи маÑÑÑ ÑÐ°ÐºÑ Ð¶ ÑÐ°Ð¼Ñ Ð·Ð½Ð°ÑеннÑ. Ðле на вÑдмÑÐ½Ñ Ð²Ñд setTimeout, Ñей меÑод запÑÑÐºÐ°Ñ ÑÑнкÑÑÑ Ð½Ðµ один Ñаз, а ÑегÑлÑÑно ÑеÑез заданий пÑомÑжок ÑаÑÑ.
Щоб пÑипиниÑи подалÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸, нам ÑлÑд викликаÑи clearInterval (timerId).
ÐаÑÑÑпний пÑиклад бÑде вÑдобÑажаÑи повÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ñ 2 ÑекÑнди. ЧеÑез 5 ÑекÑнд вивÑд пÑипинÑÑÑÑÑÑ:
// повÑоÑиÑи з ÑнÑеÑвалом 2 ÑекÑнди
let timerId = setInterval(() => alert('ÑÑк'), 2000);
// зÑпиниÑи ÑеÑез 5 ÑекÑнд
setTimeout(() => { clearInterval(timerId); alert('ÑÑоп'); }, 5000);
alertУ бÑлÑÑоÑÑÑ Ð±ÑаÑзеÑÑв, вклÑÑаÑÑи Chrome Ñа Firefox, внÑÑÑÑÑнÑй ÑÐ°Ð¹Ð¼ÐµÑ Ð¿ÑодовжÑÑ âÑÑкаÑиâ ÑвеÑÑ ÑÐ°Ñ Ð¿Ð¾ÐºÐ¸ показÑÑÑÑÑÑ alert/confirm/prompt.
ТомÑ, ÑкÑо ви запÑÑÑиÑе наведений виÑе код Ñ Ð·Ð°ÑекаÑÑе з закÑиÑÑÑм alert деÑкий ÑаÑ, Ñо наÑÑÑпний alert бÑде показано вÑдÑÐ°Ð·Ñ Ð¶, коли ви закÑиÑÑе попеÑеднÑй. ФакÑиÑний ÑнÑеÑвал мÑж Ñими alert бÑде менÑим за 2 ÑекÑнди.
Ðкладений setTimeout
ÐÑнÑÑ Ð´Ð²Ð° ÑпоÑоби запÑÑкаÑи ÑоÑÑ ÑегÑлÑÑно.
Ðдин Ñз ниÑ
â setInterval. ÐнÑий â Ñе вкладений setTimeout, напÑиклад:
/** замÑÑÑÑ:
let timerId = setInterval(() => alert('ÑÑк'), 2000);
*/
let timerId = setTimeout(function tick() {
alert('ÑÑк');
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мÑâ. Ðле планÑвалÑник поÑне âпеÑевÑÑÑÑи календаÑâ ÑÑлÑки пÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑоÑного ÑкÑипÑÑ, ÑÐ¾Ð¼Ñ "ÐÑивÑÑ" Ñ Ð¿ÐµÑÑим, а "СвÑÑ" â пÑÑÐ»Ñ Ð½Ñого.
ÐÑнÑÑÑÑ Ñакож ÑозÑиÑенÑ, повâÑÐ·Ð°Ð½Ñ Ð· бÑаÑзеÑом, випадки викоÑиÑÑÐ°Ð½Ð½Ñ Ñайм-аÑÑÑв з нÑлÑÐ¾Ð²Ð¾Ñ Ð·Ð°ÑÑимкоÑ, пÑо ÑÐºÑ Ð¼Ð¸ поговоÑимо в ÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð¦Ð¸ÐºÐ» подÑй (event loop): мÑкÑÐ¾Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ (microtasks) Ñа макÑÐ¾Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ (macrotasks).
У бÑаÑзеÑÑ Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñодо Ñого, Ñк ÑаÑÑо можÑÑÑ Ð·Ð°Ð¿ÑÑкаÑиÑÑ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ ÑаймеÑи. ÐгÑдно Ð·Ñ HTML Living Standard: âпÑÑÐ»Ñ Ð¿âÑÑи Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ ÑаймеÑÑв ÑнÑеÑвал змÑÑений бÑÑи не менÑе 4 мÑлÑÑекÑнд.â.
ÐавайÑе пÑодемонÑÑÑÑÑмо, Ñо Ñе ознаÑаÑ, на пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð½Ð¸Ð¶Ñе. setTimeout Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ Ð¿ÐµÑепланований Ñебе з нÑлÑÐ¾Ð²Ð¾Ñ Ð·Ð°ÑÑимкоÑ. Ðожен виклик запамâÑÑовÑÑ ÑеалÑний ÑÐ°Ñ Ð· попеÑеднÑого Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð² маÑÐ¸Ð²Ñ 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
ÐеÑÑÑ ÑаймеÑи запÑÑкаÑÑÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ (Ñак, Ñк напиÑано в ÑпеÑиÑÑкаÑÑÑ), а поÑÑм Ñ Ð³ÑÑ Ð²ÑÑÑÐ¿Ð°Ñ Ð¾Ð¾Ð²âÑзкова заÑÑимка мÑж викликами 4+ Ð¼Ñ Ñ Ð¼Ð¸ баÑимо 9, 15, 20, 24 ....
ÐодÑбне вÑдбÑваÑÑÑÑÑ, ÑкÑо ми викоÑиÑÑовÑÑмо setInterval замÑÑÑÑ setTimeout: setInterval(f) запÑÑÐºÐ°Ñ f кÑлÑка ÑазÑв з нÑлÑÐ¾Ð²Ð¾Ñ Ð·Ð°ÑÑимкоÑ, а поÑÑм Ñз заÑÑÐ¸Ð¼ÐºÐ¾Ñ 4+ мÑ.
Це Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ Ð¾Ð´Ð¸ÑÑ Ð· давнÑÑ ÑаÑÑв, Ñ Ð±Ð°Ð³Ð°Ñо ÑÑенаÑÑÑв ÑпиÑаÑÑÑÑÑ Ð½Ð° нÑого, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¾ ÑÑнÑÑ Ð· ÑÑÑоÑиÑÐ½Ð¸Ñ Ð¿ÑиÑин.
Таке Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÑдÑÑÑÐ½Ñ Ð´Ð»Ñ ÑеÑвеÑного JavaScript Ñ Ñам ÑÑнÑÑÑÑ ÑнÑÑ ÑпоÑоби планÑÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾Ñ Ð°ÑÐ¸Ð½Ñ ÑÐ¾Ð½Ð½Ð¾Ñ Ð·Ð°Ð´Ð°ÑÑ, напÑиклад setImmediate Ð´Ð»Ñ Node.js. Ð¢Ð¾Ð¼Ñ ÑÑ Ð¿ÑимÑÑка Ñ ÑпеÑиÑÑÑÐ½Ð¾Ñ Ð´Ð»Ñ Ð±ÑаÑзеÑÑв.
ÐÑдÑÑмки
- ÐеÑоди
setTimeout (func, delay, ... args)ÑsetInterval (func, delay, ... args)дозволÑÑÑÑ Ð·Ð°Ð¿ÑÑкаÑиfuncодин Ñаз/ÑегÑлÑÑно пÑÑлÑdelayмÑлÑÑекÑнд. - Щоб ÑкаÑÑваÑи виконаннÑ, нам ÑлÑд викликаÑи
clearTimeout/clearIntervalÐ·Ñ Ð·Ð½Ð°ÑеннÑм, Ñке повеÑÑаÑsetTimeout/setInterval. - ÐÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸
setTimeoutÑ Ð±ÑлÑÑ Ð³Ð½ÑÑÐºÐ¾Ñ Ð°Ð»ÑÑеÑнаÑивоÑsetInterval, Ñо дозволÑÑ Ð½Ð°Ð¼ бÑлÑÑ ÑоÑно вÑÑановиÑи ÑÐ°Ñ Ð¼Ñж виконаннÑми. - ÐланÑÐ²Ð°Ð½Ð½Ñ Ð· нÑлÑÐ¾Ð²Ð¾Ñ Ð·Ð°ÑÑÐ¸Ð¼ÐºÐ¾Ñ Ð·Ð° допомогоÑ
setTimeout(func, 0)(Ñе Ñаме, ÑоsetTimeout(func)) викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ âÑкомога ÑвидÑе, але пÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑоÑного ÑкÑипÑÑâ. - ÐÑаÑÐ·ÐµÑ Ð¾Ð±Ð¼ÐµÐ¶ÑÑ Ð¼ÑнÑмалÑÐ½Ñ Ð·Ð°ÑÑÐ¸Ð¼ÐºÑ Ð´Ð»Ñ Ð¿âÑÑи або бÑлÑÑе вкладениÑ
викликÑв
setTimeoutабоsetInterval(пÑÑÐ»Ñ 5 -го викликÑ) до 4 мÑ. Це з ÑÑÑоÑиÑÐ½Ð¸Ñ Ð¿ÑиÑин.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо вÑÑ Ð¼ÐµÑоди планÑÐ²Ð°Ð½Ð½Ñ Ð½Ðµ гаÑанÑÑÑÑÑ ÑоÑÐ½Ñ Ð·Ð°ÑÑимкÑ.
ÐапÑиклад, ÑÐ°Ð¹Ð¼ÐµÑ Ñ Ð±ÑаÑзеÑÑ Ð¼Ð¾Ð¶Ðµ ÑповÑлÑниÑиÑÑ Ð· багаÑÑÐ¾Ñ Ð¿ÑиÑин:
- ÐÑоÑеÑÐ¾Ñ Ð¿ÐµÑеванÑажений.
- Ðкладка бÑаÑзеÑа Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ñ ÑÐ¾Ð½Ð¾Ð²Ð¾Ð¼Ñ ÑежимÑ.
- ÐоÑÑбÑк пÑаÑÑÑ Ð²Ñд акÑмÑлÑÑоÑа в ÑÐµÐ¶Ð¸Ð¼Ñ Ð·Ð±ÐµÑÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð°ÑÑдÑ.
ÐÑе Ñе може збÑлÑÑиÑи мÑнÑмалÑний ÑнÑеÑвал ÑпÑаÑÑовÑÐ²Ð°Ð½Ð½Ñ ÑаймеÑа (мÑнÑмалÑÐ½Ñ Ð·Ð°ÑÑимкÑ) до 300 Ð¼Ñ Ð°Ð±Ð¾ навÑÑÑ 1000 Ð¼Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾ вÑд налаÑÑÑÐ²Ð°Ð½Ñ Ð¿ÑодÑкÑивноÑÑÑ Ð½Ð° ÑÑÐ²Ð½Ñ Ð±ÑаÑзеÑа Ñа ÐС.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)