2016-02-25 3 views
1

Следующий код используется для отслеживания обновлений из базы данных.Сохранение функции setTimeout после браузера бездействует

Проблема в том, что через некоторое время он перестанет работать (возможно, когда браузер не работает).

$(function() { 
    function Update() { 
     var postData = ""; 
     $.ajax({ 
      url: 'functions/ajax_api.php?dashboarddata', 
      type : 'post', 
      data: postData,     
      success: function(resp) { 
       $('#entradasmas7').html($('#entradasmas7' , resp).html()); 
       $('#entradasmenos7').html($('#entradasmenos7' , resp).html()); 

       // Call Update again after 30 seconds. 
       setTimeout(function() { Update(); }, 30000);      
      } 
     }); 
    } 

    // Call postData the first time to start it off. 
    Update(); 
}); 

Как я могу заставить его работать непрерывно независимо от состояния браузера или называть его обратно, когда окно становится активным?

ответ

1

В случае ошибки не будет перезапустить таймер, так что есть два решения:

A .: добавить обработчик ошибок и поместить setTimeout(function() { Update(); }, 30000); код в обработчик, так как в случае ошибки ничего не перезапускает таймер.

Недостатки: призвания не точны 30 сек позже в случае ответа долгого времени

$(function() { 
    function Update() { 
     var postData = ""; 
     $.ajax({ 
      url: 'functions/ajax_api.php?dashboarddata', 
      type : 'post', 
      data: postData,     
      success: function(resp) { 
       $('#entradasmas7').html($('#entradasmas7' , resp).html()); 
       $('#entradasmenos7').html($('#entradasmenos7' , resp).html()); 

       // Call Update again after 30 seconds. 
       setTimeout(function() { Update(); }, 30000);      
      }, 
      error: function() { 
       setTimeout(function() { Update(); }, 30000); 
      } 
     }); 
    } 

    // Call postData the first time to start it off. 
    Update(); 
}); 

Б .: использовать setInterval вместо SetTimer: но вы должны планировать только onece, и вы должны прервать предыдущий Аякс звоните, если наступает следующий тик:

$(function() { 
    var xhr = null; 
    function Update() { 
    var postData = ""; 
    if(xhr!=null) { xhr.abort(); } // avoid paralell call of ajax_api.php, so we stop the previous one 
    xhr = $.ajax({ 
     url: 'functions/ajax_api.php?dashboarddata', 
     type : 'post', 
     data: postData,     
     success: function(resp) { 
     $('#entradasmas7').html($('#entradasmas7' , resp).html()); 
     $('#entradasmenos7').html($('#entradasmenos7' , resp).html()); 
     } 
    }); 
    } 
    // Call postData the first time to start it off. 
    Update(); 
    setInterval(function() { Update(); }, 30000); 
}); 
+0

Вы можете упростить решение №1: написать 'setTimeout()' только один раз, в 'complete:' branch. – cFreed

+0

По состоянию на JQuery 1.5 complete также вызывается jquery в случае успеха или ошибки –

+0

Не уверен, чтобы понять, что вы имеете в виду: для меня просто потому, что 'complete:' происходит в любом случае, это подходящее место для размещения уникального 'setTimeout() '. – cFreed

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