¿Por qué mi llamada a la función que debe ser programado por setTimeout ejecuta inmediatamente? [duplicar]

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

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

    
            
  •              Llamando funciones con setTimeout ()                                      6 respuestas                          
  •     
    

Esta es mi problema. Tengo esta función para probar los servidores 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);
    }
}

Quiero la función 'doRequest ()' que se llamará en aproximadamente 10 segundos de intervalo, pero incluso con el setTimeout () las funciones se llaman inmediatamente.

Todas las ideas son bienvenidas, gracias.

PD: Incluso si pongo un valor arbitrario de 'proxytimout' no tiene ningún efecto

.
¿Fue útil?

Solución

Al dar la función a la setTimeout en esa forma, se ejecuta la función en lugar de pasar a la setTimeout. Usted tiene tres alternativas para hacer que funcione:

Da primero la función, entonces el tiempo de espera y los parámetros como los últimos argumentos:

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

O simplemente escribir una cadena que será evaluada:

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

En tercer estilo es pasar una función anónima que llama a la función. Nótese que en este caso, tiene que hacerlo en un cierre para evitar que los valores cambien en el bucle, por lo que se pone un poco complicado:

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

El segundo formato es un poco hacky, pero funciona, sin embargo, si los argumentos son valores escalares (cadenas, Ints etc). El tercer formato es un poco confuso, por lo que en este caso la primera opción, obviamente, funciona mejor para usted.

Otros consejos

Esta línea aquí está el problema:

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

doRequest() escritura es en realidad la llamada a la función. Lo que quiere es pasar la propia función:

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

Esta mala interpretación de la función setTimeout.

La función setTimeout toma una función y lo ejecuta después.
Al escribir setTimeout(doRequest(url,proxys[proxy]), proxytimeout), estás _calling la función doRequest (inmediatamente), y pasando el resultado (suponiendo que devuelve otra función) a setTimeout.

Es necesario pasar parámetros de doRequest a setTimeout, como esto:

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

Esto pasará setTimeout la función doRequest sí mismo (sin llamar primero), y también lo pasará los parámetros para dar a doRequest cuando finalmente lo llama.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top