Warum wird mein Funktionsaufruf, der von setTimeout geplant werden sollte, sofort ausgeführt? [duplicate]

Lesezeit: 3 Minuten

Warum wird mein Funktionsaufruf der von setTimeout geplant werden sollte
Ben

Hier ist mein Problem. Ich habe diese Funktion, um Proxy-Server zu testen.

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 möchte, dass die Funktion ‘doRequest()’ in ungefähr 10-Sekunden-Intervallen aufgerufen wird, aber selbst mit setTimeout() werden die Funktionen sofort aufgerufen.

Alle Ideen sind willkommen, danke.

PS: Selbst wenn ich einen beliebigen Wert für ‘proxytimout’ setze, hat dies keine Auswirkung.

Warum wird mein Funktionsaufruf der von setTimeout geplant werden sollte
Tatu Ulmanen

Wenn Sie die Funktion in dieser Form an setTimeout übergeben, wird die Funktion ausgeführt und nicht an setTimeout übergeben. Sie haben drei Alternativen, damit es funktioniert:

Geben Sie zuerst die Funktion, dann das Timeout und die Parameter als letzte Argumente an:

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

Oder schreiben Sie einfach eine Zeichenfolge, die ausgewertet wird:

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

Der dritte Stil besteht darin, eine anonyme Funktion zu übergeben, die die Funktion aufruft. Beachten Sie, dass Sie dies in diesem Fall in einer Closure tun müssen, um zu verhindern, dass sich die Werte in der Schleife ändern, sodass es etwas knifflig wird:

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

Das zweite Format ist etwas hacky, funktioniert aber trotzdem, wenn die Argumente Skalarwerte sind (Strings, Ints usw.). Das dritte Format ist etwas unklar, daher funktioniert in diesem Fall die erste Option offensichtlich am besten für Sie.

  • Korrigieren Sie mich, wenn ich falsch liege, aber da dies innerhalb einer Schleife geschieht, funktioniert die zweite Methode, die Sie angegeben haben, nicht. Der Wert von proxy wird sich ändern, da keine Schließung erstellt wird.

    – Nickf

    10. Januar 2010 um 14:13 Uhr

  • @nickf: Das wollte ich gerade sagen. Auch die dritte Option verstößt eval is evil.

    – SLaks

    10. Januar 2010 um 14:13 Uhr

  • @nickf, du bist wahr, ich habe diesen Punkt übersehen. Ich habe meine Antwort aktualisiert.

    – Tatu Ulmanen

    10. Januar 2010 um 14:28 Uhr

  • Danke, das ist eine große Hilfe, das ist eine unglaubliche Community!

    – Ben

    10. Januar 2010 um 14:32 Uhr

  • die setTimeout(doRequest, Proxytimeout, URL, Proxys[proxy]) funktioniert nicht im IE, oder?

    – Kenny

    31. Januar 2010 um 20:38 Uhr

Diese Zeile hier ist das Problem:

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

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

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

1646314509 196 Warum wird mein Funktionsaufruf der von setTimeout geplant werden sollte
SLaks

Du missverstehst die setTimeout Funktion.

Die setTimeout Funktion übernimmt eine Funktion und führt sie später aus.
Durch Schreiben setTimeout(doRequest(url,proxys[proxy]), proxytimeout)du _rufst die doRequest Funktion (sofort) und Übergabe des Ergebnisses (unter der Annahme, dass es eine andere Funktion zurückgibt) an setTimeout.

Du musst bestehen doRequest‘s Parameter zu setTimeoutso was:

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

Es wird vorübergehen setTimeout der doRequest Funktion selbst (ohne sie zuerst aufzurufen) und wird ihr auch die Parameter übergeben, die ihr übergeben werden sollen doRequest wenn es endlich ruft.

923910cookie-checkWarum wird mein Funktionsaufruf, der von setTimeout geplant werden sollte, sofort ausgeführt? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy