En ce qui concerne setInterval, nous devons mentionner setTimeout. Les deux sont utilisés pour exécuter régulièrement une certaine fonction. La différence est que setTimeout n'est exécuté qu'une seule fois, tandis que setInterval peut être exécuté en continu :
function do_sth() { console.log('Hello...'); }
setTimeout(do_sth, 2500); // 2.5 秒后,执行 do_sth 函数(只执行一次) setInterval(do_sth, 3500); // 3.5 秒后,执行 do_sth 函数(每隔 3.5 秒执行一次,一直执行下去)
En apparence, les deux ont leurs propres utilités et il n'y a pas de problème. Cependant, si la fonction exécutée par setInterval est une action qui prend du temps, setInterval appellera toujours cette fonction selon le plan d'origine, quel que soit le blocage précédent. De cette manière, au fil du temps, le nombre de fonctions en attente d'exécution. dans la file d'attente augmentera. La solution à ce problème consiste toujours à appeler de manière récursive setTimeout, tel que :
function do_sth() { console.log('Hello...'); // 即使这里执行比较耗时的动作也没问题, // 等这里执行完了才会再去调用 setTimeout setTimeout(do_sth, 2500); // 安排后续执行 } do_sth(); // 初次执行
Cette méthode d'appel récursive peut non seulement atteindre l'objectif d'exécuter une certaine fonction en boucle, mais également empêcher l'accumulation de tâches ultérieures.
Si vous pensez que cette méthode est un peu verbeuse, vous pouvez l'écrire de manière plus concise :
(function() { console.log('Hello...'); // do something here setTimeout(arguments.callee, 2500); })();
C'est tout, mais si le coût de la tâche d'exécution planifiée est faible, setInterval ne pose généralement aucun problème, mais si le coût de la tâche est relativement élevé, assurez-vous d'utiliser setTimeout.