Heim > Artikel > Web-Frontend > Lassen Sie uns über die Gründe sprechen, warum Sie versuchen sollten, setInterval nicht zu verwenden
Warum versuchen Sie nicht, setInterval zu verwenden? Im folgenden Artikel werden kurz die Gründe erläutert, warum Sie versuchen sollten, setInterval nicht zu verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Bei der Entwicklung eines Online-Chat-Tools besteht häufig die Notwendigkeit, einen Vorgang nach einer bestimmten Anzahl von Millisekunden wiederholt auszuführen. „Kein Problem“, sagten alle, „verwende einfach setInterval.“ Ich finde diese Idee schrecklich.
Ein Grund: setInterval ignoriert Codefehler
setInterval hat die ärgerliche Angewohnheit, gleichgültig zu sein, ob der aufgerufene Code einen Fehler meldet. Mit anderen Worten: Wenn der von setInterval ausgeführte Code aus irgendeinem Grund fehlschlägt, wird dieser Code unabhängig davon weiterhin aufgerufen. Schauen Sie sich den Code an
function a() { try{ a.error.here; } catch(e){ $('body').append('<div>' + e.toString() + '</div>'); throw e; } } function b() { try{ b.error.here; } catch(e) { $('body').append('<div>' + e.toString() + '</div>'); throw e; } setTimeout(b, 2000); } setInterval(a, 2000); setTimeout(b, 2000);
Grund zwei: setInterval ignoriert Netzwerkverzögerung
Gehen Sie davon aus, dass Sie den Server von Zeit zu Zeit über Ajax abfragen, um zu sehen, ob neue Daten vorhanden sind (Hinweis: Wenn Sie dies wirklich tun, dann Ich fürchte, Sie machen es falsch; es wird empfohlen, „Backoff-Polling“ zu verwenden [1]). Und aus bestimmten Gründen (Serverüberlastung, vorübergehender Netzwerkausfall, plötzlicher Anstieg des Datenverkehrs, begrenzte Benutzerbandbreite usw.) wird Ihre Anfrage viel länger dauern, als Sie denken. Aber setInterval ist das egal. Es werden weiterhin regelmäßig Anfragen ausgelöst und schließlich wird Ihre Client-Netzwerkwarteschlange mit Ajax-Aufrufen gefüllt. Schauen Sie sich den Code an. Wenn die Ausführung der von Ihnen aufgerufenen Funktion lange dauert, werden einige Aufrufe einfach ignoriert. Schauen Sie sich den Code an
var n = 0, t = 0, u = 0, i, s = 'Stopping after 25 requests, to avoid killing jsfiddle’s server'; function a() { $.post('/ajax_html_echo/', function () { --n; }); ++n; ++t; $('#reqs').html(n + ' a() requests in progress!'); if (t > 25) { clearInterval(i); $('#reqs').html(s); } } function b() { ++u; $.post('/ajax_html_echo/', function () { $('#req2').html('b(): ' + new Date().toString()); if (u <= 25) { setTimeout(b, 500); } else { $('#req2').html(s); } }); } i = setInterval(a, 500); setTimeout(b, 500);
Die Lösung ist einfach: Verwenden Sie setTimeout
Anstelle von setInterval ist es besser, die Funktion selbst zum richtigen Zeitpunkt über setTimeout aufzurufen. In den beiden vorherigen Beispielen führt die Funktion a, die setInterval verwendet, zu Fehlern, während die Funktion b, die setTimeout verwendet, eine gute Leistung erbringt.
Was ist, wenn die Abstände gleich sein müssen?
Wenn Sie wirklich sicherstellen möchten, dass das Ereignis „gleichmäßig“ ausgelöst wird, können Sie die für den letzten Anruf aufgewendete Zeit von der gewünschten Verzögerung abziehen und die resultierende Differenz dann dynamisch setTimeout als Verzögerung zuweisen. Allerdings ist zu beachten, dass JavaScript-Timer nicht sehr genau sind [2]. Aus vielen Gründen (Garbage Collection, Single-Threading von JavaScript usw.) können Sie daher selbst mit setInterval keine absolut „durchschnittliche“ Latenz erreichen. Darüber hinaus legen aktuelle Browser auch die minimale Timeout-Zeit zwischen 4 ms und 15 ms fest. Erwarten Sie also keine Fehler.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmierlehre! !
Das obige ist der detaillierte Inhalt vonLassen Sie uns über die Gründe sprechen, warum Sie versuchen sollten, setInterval nicht zu verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!