2012-02-19 13 views
9

Estoy tratando de utilizar setTimeout para comprobar si existen datos en una tabla:usando SetTimeout con llamadas Ajax

Si los datos existe no obtener los datos. Si los datos no existen, busque los datos usando load y luego haga lo mismo cada x minutos.

Esto es lo que tengo hasta ahora. Por alguna razón, el setTimeout no funciona cuando toca el bloque If.

Ni siquiera estoy seguro de si esta es la mejor manera de hacerlo.

var sTimeOut = setTimeout(function() { 
     $.ajax({ 
      url: 'CheckIfDataExists/' + 
         new Date().getTime(), 
      success: function (response) { 
       if (response == 'True') { 
        $('.DataDiv') 
         .load('GetFreshData/' + new Date() 
          .getTime(), { "Id": $("#RowID").val() }); 
       } 
      }, 
      complete: function() { 
       clearTimeout(sTimeOut); 
      } 
     }); 
    }, 10000); 

Cualquier ayuda será muy apreciada.

Actualizado ...

setTimeout(function(){checkData()}, 5000); 
    function checkData(){ 
    $.ajax({ 
      url: 'CheckIfDataExists/' + 
          new Date().getTime(), 
      success: function (response) { 
       if (response == 'True') {      
        $('.DataDiv') 
          .load('GetFreshData/' + new Date() 
           .getTime(), { "Id": $("#RowID").val() }); 
       } else { 
        $('.OutOfWindow').html('No Data Found'); 
        setTimeout(function() { checkData() }, 5000); 
       } 
      }, 
      complete: function() { 
       // clearTimeout(sTimeOut); 
      } 
     }); 
    } 
+0

¿Te [comprobado su depurador] (http://blog.niftysnippets.org /2011/03/no-excuse.html) para ver cuál es incorrecto? El JS parece perfectamente bien: http://jsfiddle.net/FgT22/ – gideon

+0

Sí. Está funcionando bien. Funciona como se esperaba cuando no hay datos en la base de datos (es decir, cuando la respuesta es verdadera). Cuando es falso, quiero volver a verificar después de x minutos. Ahí es donde parece que está el problema. No vuelve a verificar. Mi decisión de eliminar el tiempo de espera en caso de éxito es para que la próxima comprobación no se active antes de que se complete la carga anterior – mkizito76

+0

Esto es lo que tengo ahora y parece funcionar. ¿Es esta la mejor manera de hacer esto? Por cierto, gracias por la ayuda – mkizito76

Respuesta

16

Algo como esto debería funcionar, el primer fragmento se localiza por lo que podría poner a prueba ejecutarlo. Le he explicado el código y debajo de él es lo que el código debe ser

Al igual que se dio cuenta (de su actualización en su post) setTimeout sólo llama a su función objetivo vez, por lo que mantener el registro es necesario llamar de nuevo si haces un cheque que falla.

verlo en jsFiddle: http://jsfiddle.net/jQxbK/

//we store out timerIdhere 
var timeOutId = 0; 
//we define our function and STORE it in a var 
var ajaxFn = function() { 
     $.ajax({ 
      url: '/echo/html/', 
      success: function (response) { 
       if (response == 'True') {//YAYA 
        clearTimeout(timeOutId);//stop the timeout 
       } else {//Fail check? 
        timeOutId = setTimeout(ajaxFn, 10000);//set the timeout again 
        console.log("call");//check if this is running 
        //you should see this on jsfiddle 
        // since the response there is just an empty string 
       } 
      } 
     }); 
} 
ajaxFn();//we CALL the function we stored 
//or you wanna wait 10 secs before your first call? 
//use THIS line instead 
timeOutId = setTimeout(ajaxFn, 10000); 

El código debería tener este aspecto:

var timeOutId = 0; 
var ajaxFn = function() { 
     $.ajax({ 
      url: 'CheckIfDataExists/' + new Date().getTime(), 
      success: function (response) { 
       if (response == 'True') { 
        $('.DataDiv'). 
        load('GetFreshData/' + new Date(). 
          getTime(), { "Id": $("#RowID").val() }); 
        clearTimeout(timeOutId); 
       } else { 
        timeOutId = setTimeout(ajaxFn, 10000); 
        console.log("call"); 
       } 
      } 
      }); 
} 
ajaxFn(); 
//OR use BELOW line to wait 10 secs before first call 
timeOutId = setTimeout(ajaxFn, 10000); 
+0

¡Guau, eso es increíble! Muchas gracias por la ayuda. Una cosa más, cuando el evento de carga dispara las multas ajaxFn de inmediato. Me gustaría esperar (digamos 10 segundos) antes de que se active el ajaxFn (ya que la carga puede tardar algún tiempo). En otras palabras, quiero esperar, por ejemplo, 10 segundos antes de disparar el ajaxFn. ¿Es eso posible? – mkizito76

+0

@ user1219415 ¿Quiere decir que quiere esperar 10 segundos antes de su primera llamada? Actualicé la respuesta. – gideon

+0

¡FANTÁSTICO! Gracias una vez más – mkizito76

Cuestiones relacionadas