vez una tiempo solo loop funcion ejemplo ejecutar detener despues cleartimeout javascript loops for-loop settimeout

javascript - una - ¿Por qué mi llamada de función que debería ser programada por setTimeout se ejecuta inmediatamente?



javascript timer loop (3)

Esta pregunta ya tiene una respuesta aquí:

Aquí está mi problema. Tengo esta función para probar 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 que se llame a la función ''doRequest ()'' en intervalos de aproximadamente 10 segundos, pero incluso con el setTimeout () las funciones se llaman de inmediato.

Cualquier idea es bienvenida, gracias.

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


Cuando asigna la función al setTimeout en ese formulario, la función se ejecuta en lugar de pasarse a setTimeout. Tienes tres alternativas para que funcione:

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

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

O simplemente escribe una cadena que será evaluada:

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

El tercer estilo es pasar una función anónima que llama a la función. Tenga en cuenta que en este caso, debe hacerlo en un cierre para evitar que los valores cambien en el ciclo, por lo que se vuelve un poco complicado:

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

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


Estás malinterpretando la función setTimeout .

La función setTimeout toma una función y la ejecuta más tarde.
Al escribir setTimeout(doRequest(url,proxys[proxy]), proxytimeout) , se llama a la función doRequest (inmediatamente) y se pasa el resultado (asumiendo que devuelve otra función) a setTimeout .

Necesita pasar los parámetros de setTimeout a setTimeout , así:

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

Esto pasará setTimeout la función doRequest (sin llamarlo primero), y también le pasará los parámetros para dar a doRequest cuando finalmente lo llame.


Esta línea aquí es el problema:

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

Escribir doRequest() realidad está llamando a la función. Lo que quiere es pasar la función en sí:

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