颿°ãããã«ã¯å®è¡ããããããæç¹ã§å®è¡ããããã«ããããã¨ãããã¾ãããã㯠âå¼ã³åºãã®ã¹ã±ã¸ã¥ã¼ãªã³ã°â ã¨å¼ã°ãã¾ãã
ãã®ããã®2ã¤ã®ã¡ã½ãããããã¾ãã:
setTimeoutã¯æå®æéçµéå¾ãä¸åº¦ã ã颿°ãå®è¡ãã¾ããsetIntervalã¯åå®è¡ã®éã¯æå®ããééã§ã宿çã«é¢æ°ãå®è¡ãã¾ãã
ãããã®ã¡ã½ãã㯠JavaScript ã®ä»æ§ã®ä¸é¨ã§ã¯ããã¾ããããããã»ã¨ãã©ã®ç°å¢ã¯å é¨ã¹ã±ã¸ã¥ã¼ã©ããã¡ããããã®ã¡ã½ãããæä¾ãã¾ããç¹ã«ããããã¯ãã¹ã¦ã®ãã©ã¦ã¶ã¨ Node.js ã§ãµãã¼ãããã¦ãã¾ãã
setTimeout
æ§æ:
let timerId = setTimeout(func|code, delay[, arg1, arg2...])
ãã©ã¡ã¼ã¿:
func|code- 颿°ãããã¯å®è¡ããã³ã¼ãã®æååã é常ã¯é¢æ°ã§ããæ´å²çãªçç±ã§ãã³ã¼ãã®æååãæ¸¡ããã¨ãã§ãã¾ãããæ¨å¥¨ããã¾ããã
delay- å®è¡åã®é å»¶æéã§ãããªç§åä½ã§ã (1000 ms = 1 ç§).
arg1,arg2â¦- 颿°ã®å¼æ°ã§ã(IE9-ã§ã¯ãµãã¼ãããã¦ãã¾ãã)
ä¾ãã°ããã®ã³ã¼ãã¯1ç§å¾ã« sayHi() ãå¼ã³ã¾ã:
function sayHi() {
alert('Hello');
}
setTimeout(sayHi, 1000);
弿°ãããå ´åã¯ãã¡ã:
function sayHi(phrase, who) {
alert( phrase + ', ' + who );
}
setTimeout(sayHi, 1000, "Hello", "John"); // Hello, John
ããæåã®å¼æ°ãæååã®å ´åãJavaScript ã¯ãããã颿°ãä½ãã¾ãã
å¾ã£ã¦ããããåä½ãã¾ã:
setTimeout("alert('Hello')", 1000);
ããããæååã使ããã¨ã¯æ¨å¥¨ããã¦ãã¾ãããæ¬¡ã®ããã«ããããã®ä»£ããã«é¢æ°ã使ã£ã¦ãã ããã:
setTimeout(() => alert('Hello'), 1000);
åå¿è
ã®éçºè
ã¯ã颿°ã®å¾ã«æ¬å¼§ () ãã¤ãããã¹ããããã¨ãããã¾ã:
// wrong!
setTimeout(sayHi(), 1000);
setTimeout ã¯é¢æ°ã¸ã®åç
§ãæå¾
ãã¦ãããããããã¯åä½ãã¾ãããã¡ãªã¿ã«ãããã§ã¯ sayHi() 颿°ãå®è¡ãããã®å®è¡çµæ ã setTimeout ã«æ¸¡ããã¾ããæã
ã®ã±ã¼ã¹ã§ã¯ãsayHi() ã®çµæã¯ undefined(颿°ã¯ä½ãè¿ããªããã)ã§ãããä½ãã¹ã±ã¸ã¥ã¼ã«ããã¦ããªããã¨ã«ãªãã¾ãã
clearTimeout ã使ã£ããã£ã³ã»ã«
setTimeout ã®å¼ã³åºãã¯ãå®è¡ãåãæ¶ãããã«ä½¿ç¨ã§ãã âã¿ã¤ãã¼èå¥åâ timerId ãè¿ãã¾ãã
ãã£ã³ã»ã«ããããã®æ§æã¯æ¬¡ã®éãã§ã:
let timerId = setTimeout(...);
clearTimeout(timerId);
ä¸ã®ã³ã¼ãã§ã¯ãç§ãã¡ã¯é¢æ°ãã¹ã±ã¸ã¥ã¼ã«ãããã®å¾ãã£ã³ã»ã«ãã¦ãã¾ããçµæã¨ãã¦ã¯ãä½ãèµ·ãã¾ãã:
let timerId = setTimeout(() => alert("never happens"), 1000);
alert(timerId); // timer èå¥å
clearTimeout(timerId);
alert(timerId); // åã èå¥å (ãã£ã³ã»ã«å¾ null ã«ã¯ãªãã¾ãã)
alert ã®åºåããåããããã«ããã©ã¦ã¶ã§ã¯ã¿ã¤ãã¼èå¥åã¯æ°å¤ã§ããä»ã®ç°å¢ã§ã¯ãããã¯ä»ã®ä½ãã®å ´åãããã¾ããä¾ãã°ãNode.js ã ã¨ã追å ã¡ã½ãããæã¤ã¿ã¤ãã¼ãªãã¸ã§ã¯ããè¿ãã¾ãã
æ¹ãã¦ããããã®ã¡ã½ããã®ããã®æ®éçãªä»æ§ã¯ããã¾ããã®ã§åé¡ããã¾ããã
ãã©ã¦ã¶ã®å ´åãã¿ã¤ãã¼ã¯HTML5æ¨æºã®timers section ã§èª¬æããã¦ãã¾ãã
setInterval
ã¡ã½ãã setInterval 㯠setTimeout ã¨åãæ§æãæã£ã¦ãã¾ã:
let timerId = setInterval(func|code, delay[, arg1, arg2...])
ãã¹ã¦ã®å¼æ°ãåãæå³ã§ããããã setTimeout ã¨ã¯ç°ãªãã颿°ã1åã§ã¯ãªã宿çã«ä¸ããããæéééã§å®è¡ãã¾ãã
ãã以ä¸ã®å¼ã³åºããæ¢ããããã«ã¯ã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 ã¯ããã«è¡¨ç¤ºããã¾ããå®éã®ã¤ã³ã¿ã¼ãã«ééã¯ï¼ç§ãããçããªãã¾ãã
å帰çãªï¼ãã¹ããããï¼ setTimeout
宿çã«ä½ããå®è¡ããã®ã« 2ã¤ã®æ¹æ³ãããã¾ãã
1ã¤ã¯ãsetInterval ã§ãããã1ã¤ã¯ããã¹ãããã 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() {
...send request...
if (request failed due to server overload) {
// 次ã®å®è¡ã®ããã«ã¤ã³ã¿ã¼ãã«ãå¢å ããã
delay *= 2;
}
timerId = setTimeout(request, delay);
}, delay);
ã¾ããããã宿çã«CPUãå¿ è¦ã¨ããã¿ã¹ã¯ãæã£ã¦ããå ´åã«ã¯ãå®è¡ã«ããã£ãæéãè¨æ¸¬ã次ã®å¼ã³åºããè¨ç»ãããã¨ãåºæ¥ã¾ãã
å帰ç㪠setTimeout ã¯å®è¡ã®éã®é
å»¶ãä¿è¨¼ãã¾ãããsetInterval ã¯ä¿è¨¼ãã¾ãã
2ã¤ã®ã³ã¼ããæ¯è¼ãã¦ã¿ã¾ããããæåã®ä¾ã¯ setInterval ã使ãã¾ãã:
let i = 1;
setInterval(function() {
func(i++);
}, 100);
2ã¤ç®ã¯å帰ç㪠setTimeout ã使ãã¾ã:
let i = 1;
setTimeout(function run() {
func(i++);
setTimeout(run, 100);
}, 100);
setInterval ã§ã¯ãå
é¨ã¹ã±ã¸ã¥ã¼ã©ã¯100msç§æ¯ã« func(i++) ãå®è¡ãã¾ãã:
æ°ã¥ãã¾ãããâ¦ï¼
setInterval ã§ã® func å¼ã³åºãéã®å®éã®é
å»¶ã¯ã³ã¼ãå
ã®ãããããçãã§ã!
ããã¯å½ç¶ã®ãã¨ã§ãããªããªã func ã®å®è¡ã«ãããæéã¯ã¤ã³ã¿ã¼ãã«ã®ä¸é¨ã âæ¶è²»â ããããã§ãã
func ã®å®è¡ãäºæ³ãã¦ãããããé·ããªãã100ms ãè¶
ããå¯è½æ§ãããã¾ãã
ãã®ã±ã¼ã¹ã§ã¯ãã¨ã³ã¸ã³ã¯ func ã®å®äºãå¾
ã¡ã¾ãããã®å¾ãã¹ã±ã¸ã¥ã¼ã©ããã§ãã¯ãã¦æéãçµéãã¦ããå ´å㯠ããã« ãããå度å®è¡ãã¾ãã
ã¨ãã¸ã±ã¼ã¹ã§ããããã颿°ã常㫠delay ms ãããé·ãå®è¡ãããå ´åãå¼ã³åºãã¯å
¨ã忢ãããã¨ãªãèµ·ããã¾ãã
次ã«ãããã¯å帰ç㪠setTimeout ã®å³ã§ã:
å帰ç㪠setTimeout ã¯åºå®ã®é
å»¶ (ããã§ã¯ 100ms) ãä¿è¨¼ãã¾ãã
æ°ããå¼ã³åºãã¯ã以åã®å¼ã³åºãã®çµããã«è¨ç»ãããããã§ãã
颿°ã setInterval/setTimeout ã«æ¸¡ãããã¨ããå
é¨åç
§ãããã«ä½ããã¹ã±ã¸ã¥ã¼ã©ã«ä¿åããã¾ãããã®å ´åããã¨ããã®é¢æ°ã¸ã®åç
§ãä»ã«ãªãå ´åã§ãã颿°ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã«ã¯ãªãã¾ããã
// 颿°ã¯ã¹ã±ã¸ã¥ã¼ã©ãå¼ã³åºãã¾ã§ã¡ã¢ãªå
ã«çã¾ãã¾ã
setTimeout(function() {...}, 100);
setInterval ã§ã¯ clearInterval ãå¼ã°ããã¾ã§ã颿°ã¯ã¡ã¢ãªä¸ã«åå¨ãç¶ãã¾ãã
ããã«ã¯å¯ä½ç¨ãããã¾ãã颿°ã¯å¤é¨ã®ã¬ãã·ã«ã«ç°å¢ãåç §ããã®ã§ããããçãã¦ããéã¯å¤é¨ã®å¤æ°ãçãç¶ãã¾ãããããã¯é¢æ°èªèº«ãããã¯ããã«å¤ãã®ã¡ã¢ãªãå¿ è¦ã¨ããå ´åãããã¾ããå¾ã£ã¦ãã¹ã±ã¸ã¥ã¼ã«ãããæ©è½ãããå¿ è¦ãªãã¨ãã¯ããã¨ããããé常ã«å°ããã¨ãã¦ããããããã£ã³ã»ã«ããæ¹ãããã§ãã
é å»¶ãªãã® setTimeout
ç¹å¥ãªã¦ã¼ã¹ã±ã¼ã¹ãããã¾ã: setTimeout(func, 0)ããããã¯åã« setTimeout(func) ã§ãã
ãã㯠func ãã§ããã ãéãå®è¡ããããã¹ã±ã¸ã¥ã¼ã«ãã¾ããããããã¹ã±ã¸ã¥ã¼ã©ã¯ç¾å¨ã®ã³ã¼ããå®äºããå¾ã«ãããå®è¡ãã¾ãã
ãªã®ã§ã颿°ã¯ç¾å¨ã®ã³ã¼ãã® âããå¾â ã«å®è¡ããããã¹ã±ã¸ã¥ã¼ã«ããã¦ãã¾ããè¨ãæããã¨ãéåæ ã§ãã
ä¾ãã°ããã㯠âHelloâ ãåºåãããã®å¾ããã« âWorldâ ã表示ãã¾ãã:
setTimeout(() => alert("World"), 0);
alert("Hello");
æåã®è¡ã¯ â0ms å¾ã®ã«ã¬ã³ãã¼ã«å¼ã³åºããç½®ãã¦ãã¾ãâãããããã¹ã±ã¸ã¥ã¼ã©ã¯ç¾å¨ã®ã³ã¼ããå®äºããå¾ã« âã«ã¬ã³ãã¼ã®ãã§ãã¯â ããã¾ãããã®ããã "Hello" ãæåã§ã"World" ãå¾ã«ãªãã¾ãã
ã¾ããã¤ãã³ãã«ã¼ã(event loop): microtask 㨠macrotask ã®ç« ã§èª¬æãããé å»¶ãªãã® timeout ã®é«åº¦ãªãã©ã¦ã¶é¢é£ã®ã¦ã¼ã¹ã±ã¼ã¹ãããã¾ãã
ãã©ã¦ã¶ã§ã¯ããã¹ããããã¿ã¤ãã¼ãå®è¡ã§ããé »åº¦ã«å¶éãããã¾ããHTML5 æ¨æº ã§ã¯æ¬¡ã®ããã«æ¸ããã¦ãã¾ã: â5ã¤ã®ãã¹ããããã¿ã¤ãã¼ã®å¾ã«ã¯â¦ééã¯å°ãªãã¨ã4ããªç§ã«å¼·å¶ããã¾ããâ
ä½ãæå³ãã¦ããããä¸ã®ä¾ã§ãã¢ãã¦ã¿ã¾ããããä¾ã§ã® setTimeout å¼ã³åºãã¯ãèªèº«ã 0ms å¾ã«å®è¡ããããåã¹ã±ã¸ã¥ã¼ã«ãã¾ããåå¼ã³åºã㯠times é
åã«ãç´åã®ãã®ããã®å®è¡æéãè¦ãã¦ãã¾ããå®éã®é
å»¶ã¯ã©ã®ããã«è¦ããã§ãããï¼è¦ã¦ã¿ã¾ããã:
let start = Date.now();
let times = [];
setTimeout(function run() {
times.push(Date.now() - start); // åã®å¼ã³åºãããã®é
å»¶ãè¦ãã
if (start + 100 < Date.now()) alert(times); // 100ms å¾ã«é
å»¶ã表示
else setTimeout(run, 0); // ãããã¯åã¹ã±ã¸ã¥ã¼ã«
}, 0);
// åºåä¾:
// 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... ã¨ãªã£ã¦ãã¾ããå¼ã³åºãéã§4ããªç§ä»¥ä¸ã®å¿
é ã®é
å»¶ãçºçãã¾ãã
åæ§ã®ãã¨ããsetTimeout ã®ä»£ããã« setInterval ã使ç¨ããå ´åã«ãèµ·ãã¾ã: setInterval(f) ã¯æ°åã¼ãé
å»¶ã§ f ãå®è¡ãããã®å¾ 4ããªç§ä»¥ä¸ã®é
å»¶ã§å®è¡ãã¾ãã
ãã®å¶éã¯å¤ããããããå¤ãã®ã¹ã¯ãªãããããã«ä¾åãã¦ãããããæ´å²çãªçç±ããåå¨ãã¦ãã¾ãã
ãµã¼ããµã¤ã JavaScript ã§ã¯ããã®å¶éã¯åå¨ãã¾ãããã¾ããNode.js ã§ã¯ process.nextTick ã setImmediate ã®ãããªå³æéåæã¸ã§ããã¹ã±ã¸ã¥ã¼ã«ããä»ã®æ¹æ³ãåå¨ãã¾ããå¾ã£ã¦ããã®æ¦å¿µã¯ãã©ã¦ã¶åºæã®ãã®ã§ãã
ãµããª
- ã¡ã½ãã
setInterval(func, delay, ...args)ã¨setTimeout(func, delay, ...args)ã¯ãdelayããªç§ã«funcã宿çã«/ä¸åº¦ã ãå®è¡ãããã¨ãã§ãã¾ãã - å®è¡ããã£ã³ã»ã«ããããã«ã¯ã
setInterval/setTimeoutã§è¿å´ãããå¤ã¨ä¸ç·ã«clearInterval/clearTimeoutãå¼ã¶å¿ è¦ãããã¾ãã - ãã¹ãããã
setTimeoutå¼ã³åºãã¯ãsetIntervalãããæè»ã§ããã¾ããããã¯å®è¡ é ã®æå°æéãä¿è¨¼ãããã¨ãã§ãã¾ãã setTimeout(func, 0)ï¼setTimeout(funcã¨åãï¼ã§ã®é å»¶ã¼ãã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ã¯ âã§ããã ãæ©ãããããç¾å¨ã®ã³ã¼ããçµãã£ãå¾ã«â å¼ã³åºããã¹ã±ã¸ã¥ã¼ã«ããããã«ä½¿ããã¾ãã- ãã©ã¦ã¶ã¯ã5ã¤ä»¥ä¸ã®ãã¹ãããã
setTimeoutå¼ã³åºããã¾ãã¯setIntervalï¼ï¼åç®ä»¥éã®å¼ã³åºãå¾ï¼ã®æå°é å»¶ã4msã«å¶éãã¦ãã¾ããããã¯æ´å²çãªçç±ã«ãããã®ã§ãã
ãã¹ã¦ã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ã¡ã½ããã¯æ£ç¢ºãªé å»¶ã ä¿è¨¼ããªã ãã¨ã«æ³¨æãã¦ãã ããã
ä¾ãã°ããã©ã¦ã¶å ã§ã®ã¿ã¤ãã¼ã¯ãå¤ãã®çç±ã§é ããªãå¯è½æ§ãããã¾ã:
- CPUãéè² è·ã«ãªã£ã¦ãã
- ãã©ã¦ã¶ã¿ããããã¯ã¨ã³ãã¢ã¼ãã«ãªã£ã¦ãã
- ã©ããããããããããªã¼ã¢ã¼ã
æå°ã®ã¿ã¤ãã¼ç²¾åº¦(æå°é å»¶)ããã©ã¦ã¶ãè¨å®ã«å¿ãã¦300msã¾ãã¯1000msã¾ã§å¢ãããã¨ãã§ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã