ææ¶æä»¬å¹¶ä¸æ³ç«å³æ§è¡ä¸ä¸ªå½æ°ï¼èæ¯çå¾ ç¹å®ä¸æ®µæ¶é´ä¹ååæ§è¡ãè¿å°±æ¯æè°çâ计åè°ç¨ï¼scheduling a callï¼âã
ç®åæä¸¤ç§æ¹å¼å¯ä»¥å®ç°ï¼
setTimeoutå 许æä»¬å°å½æ°æ¨è¿å°ä¸æ®µæ¶é´é´éä¹ååæ§è¡ãsetIntervalå 许æä»¬éå¤è¿è¡ä¸ä¸ªå½æ°ï¼ä»ä¸æ®µæ¶é´é´éä¹åå¼å§è¿è¡ï¼ä¹å以该æ¶é´é´éè¿ç»éå¤è¿è¡è¯¥å½æ°ã
è¿ä¸¤ä¸ªæ¹æ³å¹¶ä¸å¨ JavaScript çè§èä¸ã使¯å¤§å¤æ°è¿è¡ç¯å¢é½æå 建çè°åº¦ç¨åºï¼å¹¶ä¸æä¾äºè¿äºæ¹æ³ãç®åæ¥è®²ï¼æææµè§å¨ä»¥å Node.js 齿¯æè¿ä¸¤ä¸ªæ¹æ³ã
setTimeout
è¯æ³ï¼
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
åæ°è¯´æï¼
func|code- æ³è¦æ§è¡ç彿°æä»£ç å符串ã ä¸è¬ä¼ å ¥ç齿¯å½æ°ãç±äºæäºåå²åå ï¼æ¯æä¼ å ¥ä»£ç å符串ï¼ä½æ¯ä¸å»ºè®®è¿æ ·åã
delay- æ§è¡åçå»¶æ¶ï¼ä»¥æ¯«ç§ä¸ºåä½ï¼1000 æ¯«ç§ = 1 ç§ï¼ï¼é»è®¤å¼æ¯ 0ï¼
arg1ï¼arg2â¦- è¦ä¼ å ¥è¢«æ§è¡å½æ°ï¼æä»£ç å符串ï¼çåæ°å表ï¼IE9 以ä¸ä¸æ¯æï¼
ä¾å¦ï¼å¨ä¸é¢è¿ä¸ªç¤ºä¾ä¸ï¼sayHi() æ¹æ³ä¼å¨ 1 ç§åæ§è¡ï¼
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);
æ°æå¼åè
ææ¶åä¼è¯¯å°ä¸å¯¹æ¬å· () å å¨å½æ°åé¢ï¼
// éçï¼
setTimeout(sayHi(), 1000);
è¿æ ·ä¸è¡ï¼å 为 setTimeout ææå¾å°ä¸ä¸ªå¯¹å½æ°çå¼ç¨ãèè¿éç sayHi() å¾ææ¾æ¯å¨æ§è¡å½æ°ï¼æä»¥å®é
ä¸ä¼ å
¥ setTimeout çæ¯ 彿°çæ§è¡ç»æãå¨è¿ä¸ªä¾åä¸ï¼sayHi() çæ§è¡ç»ææ¯ undefinedï¼ä¹å°±æ¯è¯´å½æ°æ²¡æè¿åä»»ä½ç»æï¼ï¼æä»¥å®é
ä¸ä»ä¹ä¹æ²¡æè°åº¦ã
ç¨ clearTimeout æ¥åæ¶è°åº¦
setTimeout å¨è°ç¨æ¶ä¼è¿åä¸ä¸ªâ宿¶å¨æ è¯ç¬¦ï¼timer identifierï¼âï¼å¨æä»¬çä¾å䏿¯ timerIdï¼æä»¬å¯ä»¥ä½¿ç¨å®æ¥åæ¶æ§è¡ã
åæ¶è°åº¦çè¯æ³ï¼
let timerId = setTimeout(...);
clearTimeout(timerId);
å¨ä¸é¢ç代ç ä¸ï¼æä»¬å¯¹ä¸ä¸ªå½æ°è¿è¡äºè°åº¦ï¼ç´§æ¥çåæ¶äºè¿æ¬¡è°åº¦ï¼ä¸éåæäºï¼ãæä»¥æåä»ä¹ä¹æ²¡åçï¼
let timerId = setTimeout(() => alert("never happens"), 1000);
alert(timerId); // 宿¶å¨æ è¯ç¬¦
clearTimeout(timerId);
alert(timerId); // è¿æ¯è¿ä¸ªæ è¯ç¬¦ï¼å¹¶æ²¡æå 为è°åº¦è¢«åæ¶äºèåæ nullï¼
ä» alert çè¾åºæ¥çï¼å¨æµè§å¨ä¸ï¼å®æ¶å¨æ è¯ç¬¦æ¯ä¸ä¸ªæ°åãå¨å
¶ä»ç¯å¢ä¸ï¼å¯è½æ¯å
¶ä»çä¸è¥¿ãä¾å¦ Node.js è¿åçæ¯ä¸ä¸ªå®æ¶å¨å¯¹è±¡ï¼è¿ä¸ªå¯¹è±¡å
å«ä¸ç³»åæ¹æ³ã
æåéç³ä¸éï¼è¿äºæ¹æ³æ²¡æç»ä¸çè§èå®ä¹ï¼æä»¥è¿æ²¡ä»ä¹é®é¢ã
é对æµè§å¨ç¯å¢ï¼å®æ¶å¨å¨ HTML5 çæ åä¸æè¯¦ç»æè¿°ï¼è¯¦è§ timers sectionã
setInterval
setInterval æ¹æ³å setTimeout çè¯æ³ç¸åï¼
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
ææåæ°çæä¹ä¹æ¯ç¸åçãä¸è¿ä¸ setTimeout åªæ§è¡ä¸æ¬¡ä¸åï¼setInterval æ¯æ¯é´éç»å®çæ¶é´å¨ææ§æ§è¡ã
æ³è¦é»æ¢åç»è°ç¨ï¼æä»¬éè¦è°ç¨ clearInterval(timerId)ã
ä¸é¢çä¾åå°æ¯é´é 2 ç§å°±ä¼è¾åºä¸æ¡æ¶æ¯ã5 ç§ä¹åï¼è¾åºåæ¢ï¼
// æ¯ 2 ç§éå¤ä¸æ¬¡
let timerId = setInterval(() => alert('tick'), 2000);
// 5 ç§ä¹å忢
setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);
å¨å¤§å¤æ°æµè§å¨ä¸ï¼å
æ¬ Chrome å Firefoxï¼å¨æ¾ç¤º alert/confirm/prompt å¼¹çªæ¶ï¼å
é¨ç宿¶å¨ä»æ§ä¼ç»§ç»âååâã
æä»¥ï¼å¨è¿è¡ä¸é¢çä»£ç æ¶ï¼å¦æå¨ä¸å®æ¶é´å
没æå
³æ alert å¼¹çªï¼é£ä¹å¨ä½ å
³éå¼¹çªåï¼ä¸ä¸ä¸ª alert ä¼ç«å³æ¾ç¤ºã两次 alert ä¹é´çæ¶é´é´éå°å°äº 2 ç§ã
åµå¥ç setTimeout
卿æ§è°åº¦æä¸¤ç§æ¹å¼ã
ä¸ç§æ¯ä½¿ç¨ setIntervalï¼å¦å¤ä¸ç§å°±æ¯åµå¥ç setTimeoutï¼å°±åè¿æ ·ï¼
/** instead of:
let timerId = setInterval(() => alert('tick'), 2000);
*/
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
ä¸é¢è¿ä¸ª setTimeout å¨å½åè¿ä¸æ¬¡å½æ°æ§è¡å®æ¶ (*) ç«å³è°åº¦ä¸ä¸æ¬¡è°ç¨ã
åµå¥ç setTimeout è¦æ¯ setInterval çµæ´»å¾å¤ãéç¨è¿ç§æ¹å¼å¯ä»¥æ ¹æ®å½åæ§è¡ç»ææ¥è°åº¦ä¸ä¸æ¬¡è°ç¨ï¼å æ¤ä¸ä¸æ¬¡è°ç¨å¯ä»¥ä¸å½åè¿ä¸æ¬¡ä¸åã
ä¾å¦ï¼æä»¬è¦å®ç°ä¸ä¸ªæå¡ï¼serverï¼ï¼æ¯é´é 5 ç§åæå¡å¨åéä¸ä¸ªæ°æ®è¯·æ±ï¼ä½å¦ææå¡å¨è¿è½½äºï¼é£ä¹å°±è¦éä½è¯·æ±é¢çï¼æ¯å¦å°é´éå¢å å° 10ã20ã40 ç§çã
以䏿¯ä¼ªä»£ç ï¼
let delay = 5000;
let timerId = setTimeout(function request() {
...åé请æ±...
if (request failed due to server overload) {
// ä¸ä¸æ¬¡æ§è¡çé´éæ¯å½åç 2 å
delay *= 2;
}
timerId = setTimeout(request, delay);
}, delay);
å¹¶ä¸ï¼å¦ææä»¬è°åº¦ç彿°å ç¨å¤§éç CPUï¼é£ä¹æä»¬å¯ä»¥æµéæ§è¡æéè¦è±è´¹çæ¶é´ï¼å¹¶å®æä¸æ¬¡è°ç¨æ¯åºè¯¥æåè¿æ¯æ¨è¿ã
åµå¥ç 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 èè¨ï¼å
é¨çè°åº¦ç¨åºä¼æ¯é´é 100 æ¯«ç§æ§è¡ä¸æ¬¡ func(i++)ï¼
注æå°äºåï¼
ä½¿ç¨ setInterval æ¶ï¼func 彿°çå®é
è°ç¨é´éè¦æ¯ä»£ç ä¸è®¾å®çæ¶é´é´éè¦çï¼
è¿ä¹æ¯æ£å¸¸çï¼å 为 func çæ§è¡æè±è´¹çæ¶é´âæ¶èâäºä¸é¨åé´éæ¶é´ã
ä¹å¯è½åºç°è¿ç§æ
åµï¼å°±æ¯ func çæ§è¡æè±è´¹çæ¶é´æ¯æä»¬é¢æçæ¶é´æ´é¿ï¼å¹¶ä¸è¶
åºäº 100 毫ç§ã
å¨è¿ç§æ
åµä¸ï¼JavaScript 弿ä¼çå¾
func æ§è¡å®æï¼ç¶åæ£æ¥è°åº¦ç¨åºï¼å¦ææ¶é´å°äºï¼å ç«å³ 忬¡æ§è¡å®ã
æç«¯æ
åµä¸ï¼å¦æå½æ°æ¯æ¬¡æ§è¡æ¶é´é½è¶
è¿ delay è®¾ç½®çæ¶é´ï¼é£ä¹æ¯æ¬¡è°ç¨ä¹é´å°å®å
¨æ²¡æåé¡¿ã
è¿æ¯åµå¥ç setTimeout ç示æå¾ï¼
åµå¥ç setTimeout å°±è½ç¡®ä¿å»¶æ¶çåºå®ï¼è¿éæ¯ 100 毫ç§ï¼ã
è¿æ¯å 为ä¸ä¸æ¬¡è°ç¨æ¯å¨å䏿¬¡è°ç¨å®ææ¶åè°åº¦çã
å½ä¸ä¸ªå½æ°ä¼ å
¥ setInterval/setTimeout æ¶ï¼å°ä¸ºå
¶å建ä¸ä¸ªå
é¨å¼ç¨ï¼å¹¶ä¿åå¨è°åº¦ç¨åºä¸ãè¿æ ·ï¼å³ä½¿è¿ä¸ªå½æ°æ²¡æå
¶ä»å¼ç¨ï¼ä¹è½é²æ¢åå¾åæ¶å¨ï¼GCï¼å°å
¶åæ¶ã
// å¨è°åº¦ç¨åºè°ç¨è¿ä¸ªå½æ°ä¹åï¼è¿ä¸ªå½æ°å°ä¸ç´åå¨äºå
åä¸
setTimeout(function() {...}, 100);
å¯¹äº setIntervalï¼ä¼ å
¥ç彿°ä¹æ¯ä¸ç´åå¨äºå
åä¸ï¼ç´å° clearInterval 被è°ç¨ã
è¿éè¿è¦æå°ä¸ä¸ªå¯ä½ç¨ã妿彿°å¼ç¨äºå¤é¨åéï¼è¯æ³¨ï¼éå ï¼ï¼é£ä¹åªè¦è¿ä¸ªå½æ°è¿åå¨ï¼å¤é¨åéä¹ä¼éä¹åå¨ãå®ä»¬å¯è½æ¯å½æ°æ¬èº«å ç¨æ´å¤çå åãå æ¤ï¼å½æä»¬ä¸åéè¦è°åº¦å½æ°æ¶ï¼æå¥½åæ¶å®ï¼å³ä½¿è¿æ¯ä¸ªï¼å ç¨å åï¼å¾å°ç彿°ã
é¶å»¶æ¶ç setTimeout
è¿å¿æä¸ç§ç¹æ®çç¨æ³ï¼setTimeout(func, 0)ï¼æè
ä»
ä»
æ¯ setTimeout(func)ã
è¿æ ·è°åº¦å¯ä»¥è®© func 尽快æ§è¡ã使¯åªæå¨å½åæ£å¨æ§è¡çèæ¬æ§è¡å®æåï¼è°åº¦ç¨åºæä¼è°ç¨å®ã
ä¹å°±æ¯è¯´ï¼è¯¥å½æ°è¢«è°åº¦å¨å½åèæ¬æ§è¡å®æâä¹åâç«å³æ§è¡ã
ä¾å¦ï¼ä¸é¢è¿æ®µä»£ç ä¼å è¾åº âHelloâï¼ç¶åç«å³è¾åº âWorldâï¼
setTimeout(() => alert("World"));
alert("Hello");
第ä¸è¡ä»£ç âå°è°ç¨å®æå°æ¥ç¨ï¼calendarï¼0 毫ç§å¤âã使¯è°åº¦ç¨åºåªæå¨å½åèæ¬æ§è¡å®æ¯æ¶æä¼å»âæ£æ¥æ¥ç¨âï¼æä»¥å
è¾åº "Hello"ï¼ç¶åæè¾åº "World"ã
æ¤å¤ï¼è¿æä¸æµè§å¨ç¸å ³ç 0 å»¶æ¶ timeout çé«çº§ç¨ä¾ï¼æä»¬å°å¨ äºä»¶å¾ªç¯ï¼å¾®ä»»å¡åå®ä»»å¡ ä¸ç« ä¸è¯¦ç»è®²è§£ã
卿µè§å¨ç¯å¢ä¸ï¼åµå¥å®æ¶å¨çè¿è¡é¢çæ¯åéå¶çãæ ¹æ® HTML5 æ å æè®²ï¼âç»è¿ 5 éåµå¥å®æ¶å¨ä¹åï¼æ¶é´é´é被强å¶è®¾å®ä¸ºè³å° 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
ç¬¬ä¸æ¬¡ï¼å®æ¶å¨æ¯ç«å³æ§è¡çï¼æ£å¦è§èéææè¿°ç飿 ·ï¼ï¼æ¥ä¸æ¥æä»¬å¯ä»¥çå° 9, 15, 20, 24...ã两次è°ç¨ä¹é´å¿
é¡»ç»è¿ 4 毫ç§ä»¥ä¸ç强å¶å»¶æ¶ãï¼è¯æ³¨ï¼è¿éä½è
没说æ¸
æ¥ï¼timer æ°ç»éåæ¾çæ¯æ¯æ¬¡å®æ¶å¨è¿è¡çæ¶å»ä¸ start çå·®å¼ï¼æä»¥æ°ååªä¼è¶æ¥è¶å¤§ï¼å®é
ä¸ååè°ç¨çå»¶æ¶æ¯æ°ç»å¼çå·®å¼ã示ä¾ä¸åå æ¬¡é½æ¯ 1ï¼æä»¥å»¶æ¶ä¸º 0ï¼
妿æä»¬ä½¿ç¨ setInterval è䏿¯ setTimeoutï¼ä¹ä¼åç类似çæ
åµï¼setInterval(f) ä¼ä»¥é¶å»¶æ¶è¿è¡å 次 fï¼ç¶å以 4 毫ç§ä»¥ä¸ç强å¶å»¶æ¶è¿è¡ã
è¿ä¸ªéå¶æ¥èªâè¿å¤æ¶ä»£âï¼å¹¶ä¸è®¸å¤èæ¬é½ä¾èµäºæ¤ï¼æä»¥è¿ä¸ªæºå¶ä¹å°±åå¨è³ä»ã
å¯¹äºæå¡ç«¯ç JavaScriptï¼å°±æ²¡æè¿ä¸ªéå¶ï¼å¹¶ä¸è¿æå ¶ä»è°åº¦å³æ¶å¼æ¥ä»»å¡çæ¹å¼ãä¾å¦ Node.js ç setImmediateãå æ¤ï¼è¿ä¸ªæéåªæ¯é对æµè§å¨ç¯å¢çã
æ»ç»
setTimeout(func, delay, ...args)åsetInterval(func, delay, ...args)æ¹æ³å 许æä»¬å¨delay毫ç§ä¹åè¿è¡func䏿¬¡æä»¥delay毫ç§ä¸ºæ¶é´é´é卿æ§è¿è¡funcã- è¦åæ¶å½æ°çæ§è¡ï¼æä»¬åºè¯¥è°ç¨
clearInterval/clearTimeoutï¼å¹¶å°setInterval/setTimeoutè¿åçå¼ä½ä¸ºå ¥åä¼ å ¥ã - åµå¥ç
setTimeoutæ¯setIntervalç¨èµ·æ¥æ´å çµæ´»ï¼å 许æä»¬æ´ç²¾ç¡®å°è®¾ç½®ä¸¤æ¬¡æ§è¡ä¹é´çæ¶é´ã - é¶å»¶æ¶è°åº¦
setTimeout(func, 0)ï¼ä¸setTimeout(func)ç¸åï¼ç¨æ¥è°åº¦éè¦å°½å¿«æ§è¡çè°ç¨ï¼ä½æ¯ä¼å¨å½åèæ¬æ§è¡å®æåè¿è¡è°ç¨ã - æµè§å¨ä¼å°
setTimeoutæsetIntervalçäºå±ææ´å¤å±åµå¥è°ç¨ï¼è°ç¨äºæ¬¡ä¹åï¼çæå°å»¶æ¶éå¶å¨ 4msãè¿æ¯åå²éçé®é¢ã
请注æï¼ææçè°åº¦æ¹æ³é½ä¸è½ ä¿è¯ ç¡®åçå»¶æ¶ã
ä¾å¦ï¼æµè§å¨å ç计æ¶å¨å¯è½ç±äºè®¸å¤åå èåæ ¢ï¼
- CPU è¿è½½ã
- æµè§å¨é¡µç¾å¤äºåå°æ¨¡å¼ã
- ç¬è®°æ¬çµèç¨çæ¯ççµæ¨¡å¼ã
ææè¿äºå ç´ ï¼å¯è½ä¼å°å®æ¶å¨çæå°è®¡æ¶å¨å辨çï¼æå°å»¶è¿ï¼å¢å å° 300ms çè³ 1000msï¼å ·ä½ä»¥æµè§å¨åå ¶è®¾ç½®ä¸ºåã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼