¿Por qué es tan voluble SetTimeOut y semi-funcional?
-
22-09-2019 - |
Pregunta
function load_result()
{
$.getJSON( "http://somesite.com/loadresult.php", function(data) {
if( data == undefined || data == null )
{
console.log( "no data" );
clearTimeout( lr_timeout );
lr_timeout = setTimeout( "load_result()", 2000 );
return;
}
insert_result_price( data );
clearTimeout( lr_timeout );
lr_timeout = setTimeout( "load_result()", 50 * ( Math.random() * 10 ) );
} );
}
y lr_timeout
se define a nivel mundial y la función load_result
se inició inicialmente en la función document.ready
. El problema es que la función no siempre funciona. Voy a verlo en Firebug y tengo otra función que se ha configurado en un setInterval que siempre funciona.
Las ideas?
Solución
Es el setTimeout
otra función (la que siempre funciona), también dentro de un $.getJSON
? Si es así, lo hace lo llaman en la misma URL (http://somesite.com/loadresult.php
en su ejemplo, pero estoy seguro de que es diferente en la vida real)?
Es posible que http://somesite.com/loadresult.php
es un recurso escamosa, y sus resultados inconsistentes se deben a ese recurso, no setTimeout
. Por supuesto, si los dos están usando ese mismo recurso, entonces eso podría no ser el problema.
Otros consejos
Nunca he experimentado un problema con setTimeout general, y yo he utilizado para un bucle principal / infinito en JS unas cuantas veces sin que nunca tener un problema. Me imagino que clearTimeout de una invocación de load_results está pisando setTimeout de otro, especialmente porque es en respuesta a una petición GET que pueden llevar más tiempo del que se tarda el navegador para moverse a la siguiente setTimeout. De hecho, existen múltiples hilos pasando aquí, solo hay ningún control sobre ellos y no hay ningún mecanismo de sincronización disponibles.