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!

War es hilfreich?

Lösung

Es gibt 2 Hauptprobleme mit Ihrem Code:

  1. t wird für jeden Zeitpunkt überschrieben und verliert den Hinweis auf die vorherige Zeitüberschreitung bei jeder Iteration.
  2. t ist möglicherweise keine globale Variable, also stopcheck() 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:

  1. Der Hauptpunkt ist, dass Sie überschreiben t Bei jeder Iteration von Ihrer for Schleife; Sie brauchen eine Reihe von ts, damit Ihre Struktur funktioniert.
  2. Sie verwenden for..in durch die Indizes des Arrays durchlaufen. Das ist nicht was for..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 altmodische for Schleife.
  3. Sie erklären proxys zweimal. Das ist tatsächlich harmlos, aber ...
  4. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top