JavaScript: Die SetTimeout kann nicht stoppen
-
20-09-2019 - |
Frage
Ich arbeite an einem Proxy -Server -Checker und habe den folgenden Code, um die Anforderungen in Intervallen von rund 5 Sekunden mit der SetTimeout -Funktion zu starten.
function check() {
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var proxys = proxys.split(",");
for (proxy in proxys) {
var proxytimeout = proxy*5000;
t = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
}
Ich kann sie jedoch nicht aufhalten, sobald sie angefangen haben!
function stopcheck() {
clearTimeout(t);
}
Eine Korrektur oder eine bessere Methode wird eher geschätzt.
Vielen Dank an Stack Overflow Community!
Lösung
Es gibt 2 Hauptprobleme mit Ihrem Code:
t
wird für jeden Zeitpunkt überschrieben und verliert den Hinweis auf die vorherige Zeitüberschreitung bei jeder Iteration.t
ist möglicherweise keine globale Variable, alsostopcheck()
Möglicherweise nicht in der Lage sein, "zu sehen"t
.
Aktualisierte Funktionen:
function check() {
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var timeouts = [];
var index;
var proxytimeout;
proxys = proxys.split(",");
for (index = 0; index < proxys.length; ++index) {
proxytimeout = index * 5000;
timeouts[timeouts.length] = setTimeout(
doRequest, proxytimeout, url, proxys[index];
);
}
return timeouts;
}
function stopcheck(timeouts) {
for (var i = 0; i < timeouts.length; i++) {
clearTimeout(timeouts[i]);
}
}
Beispiel der Verwendung:
var timeouts = check();
// do some other stuff...
stopcheck(timeouts);
Andere Tipps
Wo wird 'T' definiert? Es wird immer wieder in der für Schleife neu definiert, sodass Sie jeden Zeitmeistergriff den Überblick verlieren werden ...
Sie können eine Reihe von Griffen führen:
var aTimeoutHandles = new Array();
var iCount = 0;
for (proxy in proxys) {
var proxytimeout = proxy*5000;
aTimeoutHandles[iCount++] = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
Definieren t
außerhalb von beiden Funktionen zuerst. Zusätzlich überschreiben Sie t
Mit jeder Iteration Ihre for
Schleife. Vielleicht bauen Sie eine Sammlung von Referenzen und dann, um sie zu stoppen, durch die Sie durchlaufen und clearTimeout
auf jeder.
Du überschreibst t
Jedes Mal, wenn Sie das Intervall festlegen. Daher klären Sie nur den letzten Satz.
Sieht so aus, als würden Sie mehrere Zeitüberschreitungen festlegen (eine für jeden Proxy), aber versuchen, sie in derselben Variablen zu speichern. Sie müssen dort wahrscheinlich ein Array anstelle einer einfachen Variablen verwenden.
Sie haben dort ein paar Probleme:
- Der Hauptpunkt ist, dass Sie überschreiben
t
Bei jeder Iteration von Ihrerfor
Schleife; Sie brauchen eine Reihe vont
s, damit Ihre Struktur funktioniert. - Sie verwenden
for..in
durch die Indizes des Arrays durchlaufen. Das ist nicht wasfor..in
ist für (obwohl es a gibt viel von Menschen, die darüber verwirrt sind; Siehe diesen Artikel).for..in
Schleifen durch die Eigenschaftsnamen eines Objekts, nicht der Indizes eines Arrays, und daher bricht diese Verwendung in nicht trivialen Situationen auf. Verwenden Sie einfach eine altmodischefor
Schleife. - Sie erklären
proxys
zweimal. Das ist tatsächlich harmlos, aber ... - Du erklärst nicht
proxy
Überhaupt (was nicht harmlos ist; es wird ein implizites globales).
Ich habe den Code in Jordans hervorragender Antwort aktualisiert, um diese anzusprechen.