嵌套/循环ajax函数要么使php失败,要么成功并使网站ui冻结

时间:2017-06-03 23:32:38

标签: php ajax loops asynchronous nested

我有一个php网站。加载页面后,运行ajax,然后在该ajax成功时,它循环遍历数组并为数组中的每个项目运行ajax。

当我像往常一样(不使用'async: false')时,网站UI按预期工作,但后端PHP处理是一个混乱而失败。但是当我为AJAX设置asynch为false时,用户界面冻结但后端处理运行完美。

如何通过迭代数组来运行ajax,但在继续循环之前确保它已完成?

这是我过于简化的javascript / ajax结构:

//run once
$.ajax({ url: '/functions/myfile.php',
         data: { blahblahblah },
         type: 'post',
         success: function(data){
             var ajaxIDToConvert = [(array contents)];
             var arrayLength = ajaxIDToConvert.length;
             //loops
                 for (var i = 0; i < arrayLength; i++) {
                     var meh = ajaxIDToConvert[i];

                     $.ajax({ url : '/functions/myfile.php',
                              type : 'post',
                              async: false,
                              data : { blahblahblah},
                              success : function(convertdata) {
                                  var convertResponse = JSON.parse(convertdata);
                              },
                              error: function (err) {
                              }
                            });
                 }
         },
         error: function (err) {

                         }
});

当不使用'async false'时,我的PHP日志输出示例,因为您可以看到php代码失败:

  

要转换的文件:527
转换为527:周六06:30:06

     

要转换的文件:523
转换为523:周六06:30:06

     

要转换的文件:522
转换为522:星期六06:30:06

     

要转换的文件:524
转换为524:周六06:30:06

     

要转换的文件:526
转换为526:周六06:30:06

     

要转换的文件:525
转换为525:周六06:30:06 pm   
转换结束为522:星期六06:30:38分
522未创建
转换   结束为524:周六06:30:39下午524未创建

     

要转换的文件:528
转换为528:周六06:30:39开始

     

要转换的文件:529
转换为529:周六06:30:39 pm   转换结束为525:周六06:30:40下一页525未创建
转换   523结束:周六06:30:42左右,523未创建

以下是使用'asynch:false'时PHP输出的示例:
(它会产生所需的结果......但网页会在运行时冻结)

  

要转换的文件:522
转换为522:星期六06:33:03 pm   转换结束为522:周六06:33:12 pm
522成功创建了

     

要转换的文件:523
转换为523:星期六06:33:13   转换结束为523:星期六06:33:22 pm
523成功创作

     

要转换的文件:524
转换为524:周六06:33:22   转换结束为524:周六06:33:32下一页524成功创建了

     

要转换的文件:525
转换为525:周六06:33:32   转换结束为525:周六06:33:42 pm
525成功创作

     

要转换的文件:526
转换为526:星期六06:33:42   转换结束为526:星期六06:33:52 pm
526成功创作

我也尝试在第一个ajax的成功括号内执行以下操作,但它导致与上面第一个php输出相同的php执行问题:

var promises = [];
for (var i = 0; i < $total_files; i++){ 
   /* $.ajax returns a promise*/      
   var request = $.ajax({
        /* your ajax config*/
   })

   promises.push( request);
}

$.when.apply(null, promises).done(function(){
   alert('All done')
})

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

var ajaxIDsToConvert = [1, 2, 3];
var deferred = $.Deferred();
var promise = deferred.promise();

$.each(ajaxIDsToConvert, function(index, id) {
    promise = promise.pipe(function () { 
      return $.ajax({
        // do required actions with `id` variable
      });
    });
});

deferred.resolve();