Wenn es um setInterval geht, müssen wir setTimeout erwähnen. Beide werden verwendet, um eine bestimmte Funktion regelmäßig auszuführen. Der Unterschied besteht darin, dass setTimeout nur einmal ausgeführt wird, während setInterval wie folgt ausgeführt werden kann:
function do_sth() { console.log('Hello...'); }
setTimeout(do_sth, 2500); // 2.5 秒后,执行 do_sth 函数(只执行一次) setInterval(do_sth, 3500); // 3.5 秒后,执行 do_sth 函数(每隔 3.5 秒执行一次,一直执行下去)
Oberflächlich betrachtet haben beide ihre eigenen Verwendungszwecke und es gibt kein Problem. Wenn die von setInterval ausgeführte Funktion jedoch eine zeitaufwändige Aktion ist, ruft setInterval diese Funktion unabhängig von vorherigen Blockierungen weiterhin gemäß dem ursprünglichen Plan auf. Auf diese Weise nimmt mit der Zeit die Anzahl der Funktionen zu, die auf die Ausführung warten in der Warteschlange wird zunehmen. Die Lösung für dieses Problem besteht immer noch darin, setTimeout rekursiv aufzurufen, z. B.:
function do_sth() { console.log('Hello...'); // 即使这里执行比较耗时的动作也没问题, // 等这里执行完了才会再去调用 setTimeout setTimeout(do_sth, 2500); // 安排后续执行 } do_sth(); // 初次执行
Diese rekursive Aufrufmethode kann nicht nur den Zweck erreichen, eine bestimmte Funktion in einer Schleife auszuführen, sondern auch verhindern, dass sich nachfolgende Aufgaben ansammeln.
Wenn Sie der Meinung sind, dass diese Methode etwas wortreich ist, können Sie sie prägnanter schreiben:
(function() { console.log('Hello...'); // do something here setTimeout(arguments.callee, 2500); })();
Das ist alles, aber wenn die Aufgabenkosten der geplanten Ausführung gering sind, ist setInterval im Allgemeinen kein Problem, aber wenn die Aufgabenkosten relativ hoch sind, verwenden Sie unbedingt setTimeout.