Warum ist meine Funktionsaufruf, sollte geplant werden durch setTimeout sofort ausgeführt? [Duplikat]

StackOverflow https://stackoverflow.com/questions/2037203

Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Aufruf von Funktionen mit setTimeout ()                                      6 Antworten                          
  •     
    

Hier ist mein Problem. Ich habe diese Funktion zu Test-Proxy-Server.

function crawl() {
    var oldstatus = document.getElementById('status').innerHTML;
    document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />";
    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*10000;
        setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
    }
}

Ich mag die ‚doRequest ()‘ Funktion in rund 10 Sekunden-Intervallen aufgerufen werden, sondern auch mit der setTimeout () die Funktionen sofort aufgerufen werden.

Alle Ideen sind willkommen, danke.

PS: Auch wenn ich legte einen beliebigen Wert für ‚proxytimout‘ es hat keine Wirkung

.
War es hilfreich?

Lösung

Wenn Sie die Funktion zum SetTimeout in dieser Form geben, wird die Funktion statt übergeben an die setTimeout ausgeführt. Sie haben drei Alternativen es funktioniert:

Geben Sie zunächst die Funktion, dann das Timeout und die Parameter wie die letzten Argumente:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

Oder schreiben Sie einfach eine Zeichenfolge, die ausgewertet werden:

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);

Third-Stil ist eine anonyme Funktion zu übergeben, der die Funktion aufruft. Beachten Sie, dass in diesem Fall, können Sie es in einem Verschluss zu tun haben, die Werte zu ändern in der Schleife zu verhindern, so dass es ein bisschen knifflig:

(function(u, p, t) {
    setTimeout(function() { doRequest(u, p); }, t);
})(url, proxys[proxy], proxytimeout);

Das zweite Format ist ein bisschen hacky, funktioniert aber trotzdem, wenn die Argumente sind skalare Werte (Strings, Ints usw.). Das dritte Format ist ein wenig unklar, so dass in diesem Fall die erste Option wird natürlich am besten für Sie.

Andere Tipps

Diese Linie ist hier das Problem:

setTimeout(doRequest(url,proxys[proxy]), proxytimeout);

Schreiben doRequest() ruft tatsächlich die Funktion. Was Sie wollen, ist es, die Funktion zu übergeben sich:

setTimeout(doRequest, proxytime, url, proxys[proxy]);

Sie sind Missverständnis der setTimeout Funktion.

Die setTimeout Funktion nimmt eine Funktion und führt es später.
Durch das Schreiben setTimeout(doRequest(url,proxys[proxy]), proxytimeout), sind _calling Sie die doRequest Funktion (sofort) und Leiten des Ergebnisses (unter der Annahme, dass es eine andere Funktion gibt) zu setTimeout.

Sie müssen doRequest-Parameter zu setTimeout passieren, wie folgt aus:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

Dies wird passieren setTimeout die doRequest Funktion selbst (ohne es vorher anzurufen), und es wird auch die Parameter übergeben zu doRequest geben, wenn sie es schließlich nennen.

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