Pourquoi mon appel de fonction qui devrait être prévue par setTimeout exécuté immédiatement? [dupliquer]

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

Question

    

Cette question a déjà une réponse ici:

    
            
  •              Appel de fonctions avec setTimeout ()                                      6 réponses                          
  •     
    

Voici mon problème. J'ai cette fonction pour tester les serveurs proxy.

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);
    }
}

Je veux que la fonction «doRequest () à appeler en environ 10 secondes, mais même avec le setTimeout () les fonctions sont appelées immédiatement.

Toutes les idées sont les bienvenues, merci.

PS: Même si je mets une valeur arbitraire pour « proxytimout » il n'a pas d'effet

.
Était-ce utile?

La solution

Comme vous donnez la fonction à la setTimeout sous cette forme, la fonction est exécutée au lieu de passer à l'setTimeout. Vous avez trois possibilités pour le faire fonctionner:

Donnez d'abord la fonction, le délai d'attente et les paramètres que les derniers arguments:

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

Ou il suffit d'écrire une chaîne qui sera évaluée:

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

le style troisième est de passer une fonction anonyme qui appelle la fonction. Notez que dans ce cas, vous devez le faire dans une fermeture pour empêcher les valeurs de changer dans la boucle, il devient un peu délicat donc:

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

Le second format est un peu hacky, mais fonctionne quand même si les arguments sont des valeurs scalaires (chaînes, ints, etc.). Le troisième format est un peu clair, dans ce cas la première option mieux pour vous évidemment travailler.

Autres conseils

Cette ligne est le problème:

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

doRequest() d'écriture appelle en fait la fonction. Ce que vous voulez est de passer la fonction elle-même:

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

Vous êtes mal compris la fonction setTimeout.

La fonction setTimeout prend une fonction et exécute plus tard.
En écrivant setTimeout(doRequest(url,proxys[proxy]), proxytimeout), vous _calling la fonction doRequest (immédiatement), et en faisant passer le résultat (en supposant qu'il retourne une autre fonction) à setTimeout.

Vous devez passer les paramètres de doRequest à setTimeout, comme ceci:

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

passera setTimeout la fonction doRequest lui-même (sans l'appeler en premier), et aussi transmettre les paramètres à donner à doRequest quand il appelle enfin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top