2012-02-19 11 views
9

Próbuję użyć setTimeout w celu sprawdzenia, czy istnieją dane w tabeli:użyciu setTimeout z Ajax wzywa

Jeżeli istnieją dane nie pobierać dane. Jeśli dane nie istnieją, pobierz dane za pomocą obciążenia, a następnie wykonaj to samo co x minut.

Oto, co mam do tej pory. Z jakiegoś powodu, setTimeout nie działa, gdy trafi w blok If.

Nie jestem nawet pewien, czy to najlepszy sposób na zrobienie tego.

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

Każda pomoc zostanie bardzo doceniona.

Updated ...

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

byłaś [sprawdził swój debugger] (http://blog.niftysnippets.org /2011/03/no-excuse.html), aby zobaczyć, co jest nie tak? JS wydaje się idealnie w porządku: http://jsfiddle.net/FgT22/ – gideon

+0

Tak. Działa dobrze. Działa zgodnie z oczekiwaniami, gdy w bazie danych nie ma danych (czyli wtedy, gdy odpowiedź jest prawdziwa). Gdy jest to fałsz, chcę ponownie sprawdzić po x minutach. Właśnie tam wydaje się problem. To się nie sprawdza. Mój ida w celu wyzerowania limitu czasu na sukces jest taki, że następnego sprawdzenia nie należy odpalać przed zakończeniem poprzedniego obciążenia. – mkizito76

+0

To jest to, co mam teraz i wygląda na to, że działa. Czy to najlepszy sposób na zrobienie tego? Przy okazji, dziękuję za pomoc. – mkizito76

Odpowiedz

16

Coś jak to powinno działać, pierwszy fragment jest zlokalizowana więc mogę przetestować go uruchomić. Mam wyjaśnione poniżej kod i to jest to, co Twój kod powinien być

Jakbyś sobie sprawę (z aktualizacją Twojego posta) setTimeout zwraca tylko swoją docelową funkcję raz, tak aby zachować kontrolę trzeba zadzwonić to znowu, jeśli zrobisz czek, który się nie powiedzie.

Zobacz na 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); 

Kod powinien wyglądać następująco:

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

Wow, to jest niesamowite! Bardzo dziękuję za pomoc. Jeszcze jedno, gdy zdarzenie load uruchamia polecenie ajaxFn natychmiast. Chciałbym poczekać (powiedzmy 10 sekund) przed uruchomieniem ajaxFn (ponieważ ładowanie może zająć trochę czasu). Innymi słowy, chcę poczekać 10 sekund, zanim uruchomię ajaxFn. Czy to jest możliwe? – mkizito76

+0

@ user1219415 Masz na myśli, że chcesz poczekać 10 sekund przed pierwszym PIERWSZYM połączeniem? Zaktualizowałem odpowiedź. – gideon

+0

FANTASTYCZNA! Jeszcze raz dziękuję – mkizito76