我有一个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')
})
答案 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();