2012-02-19 3 views
9

Я пытаюсь использовать SetTimeout, чтобы проверить, существует ли данные в таблице:использованием SetTimeout с Ajax звонки

Если существует данные не выборки данных. Если данные не существуют, извлекайте данные с использованием нагрузки, а затем делайте то же самое каждые x минут.

Вот что у меня есть. По какой-то причине setTimeout не работает, когда он попадает в блок If.

Я даже не уверен, что это лучший способ сделать это.

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

Любая помощь будет принята с благодарностью.

Обновлено ...

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

Вы [проверили ваш отладчик] (http://blog.niftysnippets.org /2011/03/no-excuse.html), чтобы узнать, что не так? JS выглядит отлично: http://jsfiddle.net/FgT22/ – gideon

+0

Да. Он работает нормально. Он работает так, как ожидалось, когда в базе данных нет данных (то есть когда ответ верен). Когда он ошибочен, я хочу перепроверять через x минут. Вот тут и проблема. Он не перепроверяет. Моя идентификация очистки тайм-аута на успех такова, что следующая проверка не должна быть запущена до того, как будет завершена предыдущая загрузка. – mkizito76

+0

Это то, что у меня есть сейчас, и это работает. Это лучший способ сделать это? Кстати, спасибо за помощь – mkizito76

ответ

16

Что-то, как это должно работать, то первый фрагмент локализуется так что я мог проверить его запуска. Я объяснил код и ниже это то, что ваш код должен быть

Как вы поняли (с вашего обновления на ваш пост) setTimeout вызывает только ваша целевая функция раз, так держать проверки вам нужно позвонить это снова, если вы делаете чек, который терпит неудачу.

Посмотри на 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); 

Ваш код должен выглядеть следующим образом:

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

Ничего себе, это здорово! Огромное спасибо за помощь. Еще одна вещь, когда событие загрузки запускает штраф ajaxFn сразу. Я хочу, чтобы у вас было ожидание (скажем, 10 секунд) до того, как ajaxFn срабатывает (так как загрузка может занять некоторое время). Другими словами, я хочу подождать 10 секунд, прежде чем я запустил ajaxFn. Это возможно? – mkizito76

+0

@ user1219415 Вы хотите подождать 10 секунд перед первым ПЕРВОГО звонка? Я обновил ответ. – gideon

+0

FANTASTIC! Еще раз спасибо – mkizito76

Смежные вопросы