为什么在使用每个循环时,返回的值的顺序不一样?
我在php中有代码
$selectedYear = 2018;
$months = array (
0 => 'January',
1 => 'February',
...
11 => 'December'
);
现在,foreach $months
我想创建具有不同值的新行(<tr>
)等。
我正在使用AJAX:
var selectedYear = <?= json_encode( $selectedYear ) ?>;
var month= <?= json_encode( $months); ?>;
$(month).each(function(k)
{
$.ajax({
type : 'POST',
url : 'scripts/ajax-monthTr.php',
data : {month: k, selectedYear: selectedYear},
beforeSend: function()
{
$('.preloader').css('display', 'block');
},
success : function(data)
{
$('#newTr').append(data);
$('.preloader').css('display', 'none');
}
}); // end ajax
});
我的结果不符合以下顺序:
<table>
<tr id="0">January</tr>
<tr id="3">April</tr>
<tr id="2">March</tr>
<tr id="5">July</tr>
<tr id="1">"February"</tr>
...
</table>
任何解决方案吗?我错过了什么吗?
我试过
$(month).each(function(k)
或
for(var i = 0; i < month.lenght; i++)
答案 0 :(得分:1)
那是因为每个ajax调用的结果是以不同的间隔返回数据。你可以:
1)在调用ajax函数之前附加数据。
2)或者,在每个ajax函数中追加新行后,根据id属性对tr元素进行排序
var items = $('#newTr tr');
items.sort(function(a, b){
return $(a).attr('id') - $(b).attr('id');
});
items.appendTo('#newTr');
<强> Working Demo 强>
答案 1 :(得分:0)
您正在执行一个请求,以便从一个月内获取数据,而无需等待请求获取月份i-1的响应。假设您提出了从第1个月获取数据的请求,那么您不会等待对此请求的响应,并且您也会在第2个月发出请求,也许第2个月的响应可能会在月份响应之前到达1.另请参阅此技巧:https://en.wikipedia.org/wiki/HTTP_pipelining
答案 2 :(得分:0)
看起来您期待AJAX调用的同步行为。您的代码使用回调,因此此功能
success : function(data)
{
$('#newTr').append(data);
$('.preloader').css('display', 'none');
}
每次POST后都会触发。这些POST调用的到达顺序不依赖于您。所有网络呼叫完成后,您应该重新考虑进行循环。