我正在使用带有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');
请帮助我,预付费用。
答案 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)
}
});
}
的值,因此最终只会显示为最后一个驱动程序检索的数据。