使用javaScript显示特定记录

时间:2016-08-02 10:31:24

标签: javascript jquery

我正在使用带有jQuery的javaScript。我有一些数据,但它显示两次。

<input type="hidden" id="btnlistTime" /> 
for(var i = 0; i < msg.driverList.length; i++){
      $.ajax({
             type: "post",
             url: "data/get_lastReportedTime.php",
             data: {Driver: msg.driverList[i].fullname}
      }).done(function (data){
          $('#btnlistTime').val(data);
          for(var i = 0; i < msg.driverList.length; i++){ 
              OnlineDriver.push([msg.driverList[i].id,
                                 msg.driverList[i].fullname,
                                 $('#btnlistTime').val(),
                                 msg.driverList[i].lat,
                                 msg.driverList[i].lng,
                                 msg.driverList[i].logintime]);
          }
      });
 }
 UpdateOnlineDriver(OnlineDriver);

 function UpdateOnlineDriver(data) {

     tableOnlineDriver = $('#tblDriverDetails').dataTable({
         "data": data,
         "bFilter": true,
         "stateSave": true,
         "columnDefs": [            
                {"sClass": "hide_me", "aTargets": [3]},
                {"sClass": "hide_me", "aTargets": [4]},
                {"sClass": "hide_me", "aTargets": [5]}
         ]
  });
}

使用ajax我上次从DataBase中获取并添加到msg.driverList中,它来自socket,就像这样。

('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');

但问题是当我引用页面时,它显示为这样,

('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');

所以请帮助我如何解决它,我想表现出来,

('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');

请帮助我,预付费用。

2 个答案:

答案 0 :(得分:0)

请尝试更改for循环中的变量名称,如下所示:

for(var i = 0; i < msg.driverList.length; i++){
  $.ajax({
         type: "post",
         url: "data/get_lastReportedTime.php",
         data: {Driver: msg.driverList[i].fullname}
  }).done(function (data){
      $('#btnlistTime').val(data);
      // change var "i" to "j"
      for(var j = 0; j < msg.driverList.length; j++){ 
          OnlineDriver.push([msg.driverList[j].id,
                             msg.driverList[j].fullname,
                             $('#btnlistTime').val(),
                             msg.driverList[j].lat,
                             msg.driverList[j].lng,
                             msg.driverList[j].logintime]);
      }
  });
}

答案 1 :(得分:0)

您的代码中有几个问题:

  • 您提供给done的函数中的异步执行代码将在您的电话UpdateOnlineDriver(OnlineDriver)后执行。首先,将执行整个外部for循环,然后执行UpdateOnlineDriver,然后才会开始调用done的回调函数。要解决此问题,您需要在done回调中调用它,并且只有在检索到最后一个数据时才会调用它。

  • 在回调函数中有一个for循环是没有意义的,因为它将为每个驱动程序单独调用(参见外部循环):只计算{{1}的数量你将要做的调用:对于外部循环的每次迭代,你将再次迭代所有驱动程序并执行push。所以这是一个二次推进量。不能成为你想要的。

  • 删除内部push循环后,您将遇到变量 i 首次运行到最后的问题,然后才会调用回调函数很多次,每个都具有 i 的值在数组的长度上相等。但是您希望在每次回调调用中获得 i 的不同值。为此,有许多解决方案,其中之一是使用for而不是let

以下是var循环部分的建议修正:

for

请注意,您将一次又一次地覆盖// Use "let" instead of "var" to have a locally scoped variable // which is available within the $.ajax callback for(let i = 0; i < msg.driverList.length; i++){ $.ajax({ type: "post", url: "data/get_lastReportedTime.php", data: {Driver: msg.driverList[i].fullname} }).done(function (data){ // Do not iterate here. $('#btnlistTime').val(data); OnlineDriver.push([ msg.driverList[i].id, msg.driverList[i].fullname, $('#btnlistTime').val(), msg.driverList[i].lat, msg.driverList[i].lng, msg.driverList[i].logintime ]); // If this is the last entry, then call out if (i === msg.driverList.length-1) { UpdateOnlineDriver(OnlineDriver) } }); } 的值,因此最终只会显示为最后一个驱动程序检索的数据。