2013-03-12 66 views
0

我试图通过访问一个Web服务更新我的DataTable中的单元格的值从脱机到联机(反之亦然)。遍历表行并执行每行setInterval似乎并不工作

var $myTable = $("#my-table").dataTable(); 
var $myTableRows = $myTable.fnGetNodes(); 

for(var i=0; i<$myTableRows.length; i++) { 
    var $currentRowCount = i; 
    var $interval = $($myTableRows[i]).find("td:eq(9)").html(); 
    var $timeout = $($myTableRows[i]).find("td:eq(10)").html(); 
    var $dataINeedToPass = $($myTableRows[i]).find("td span:eq(4)").html(); 
    setInterval(function() { updateStuffOnTheTable($interval, $timeout, $dataINeedToPass, i); }, 4000); 
} 

function updateStuffOnTheTable(interval, timeout, dataINeedToPass, row) { 
    var $stuff = "Offline"; 
    var ajaxCall = $.ajax({ 
      url : "https://localhost:8443/cxf/mywebservice/" + dataINeedToPass, 
      type : "GET", 
      dataType : 'text', 
      timeout: 2000 
     }).done(function(data) { 
      $stuff = "Online"; 
     }) 
     .fail(function(data) { 
      $stuff = "Offline"; 
     }) 
     .always(function(data) { 
      $myTable.fnUpdate($stuff, row, 2); 
     }) 
} 

问题是,AJAX请求只执行一次而不是每4000ms。我在这里错过了什么?

回答

2

它可能以满意的方式工作,除了浏览器将继续从缓存获取请求的数据,因为您一直在查询相同的URL。

要解决这个问题,它的常见做法是在查询字符串中添加一个虚拟变量与查询时间或随机数,它将更改URL,迫使浏览器再次从服务器检索它。

所以基本上你可以在你的函数updateStuffOnTheTable声明var now = new Date();,然后装入您的网址是这样的:

"https://localhost:8443/cxf/mywebservice/" + dataINeedToPass + '?now=' + now.getTime() 

您也可以尝试使用POST请求来解决这个问题,sinse AJAX POST请求不会被缓存。