Jquery每个函数都没有按顺序排列

时间:2018-04-20 13:10:56

标签: php jquery ajax

为什么在使用每个循环时,返回的值的顺序不一样?

我在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++)

3 个答案:

答案 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调用的到达顺序不依赖于您。所有网络呼叫完成后,您应该重新考虑进行循环。