如果ajax返回错误,我似乎无法摆脱每个循环。我试过了
return false;
和其他类似的东西,但$ .each仍然继续运行。
我需要能够这样做,以便我可以在通过ajax发布之后显示来自我后端的错误消息(我知道这是不好的做法,但是客户端需要能够发送多个表单一次。)。
有谁能解释我做错了什么?
var postAll = function(button_clicked)
{
e.preventDefault();
var form_response = [];
var formsCollection = document.getElementsByTagName("form");
$.each(formsCollection, function (key, value)
{
console.log(value.action);
console.log(value.id);
var url = value.action;
var id = value.id;
var data = ($('#' + id + '').serialize());
if (id == 'additionalInfo')
{
data = {'Add_info': $('#Add_info').val(),};
}
if (id != 'DONE')
{
$.ajax({
type: "POST",
dataType: 'json',
url: url,
beforeSend: function (xhr)
{
xhr.setRequestHeader('X-CSRF-TOKEN',$("#token").attr('content'));
},
data: data,
success: function (data)
{
console.log('success'); // show response from the php script.
form_response.push(data); // show response from the php script.
},
error: function (data)
{
console.log('fail'); // show response from the php script.
display_errors(data, id); // show response from the php script.
return true;
}
});
}
});
}
答案 0 :(得分:1)
如果断开循环就意味着你的错误处理程序中的return
,那么它就不会像你想象的那样工作。
您的循环立即创建异步请求'。然后,这些请求中的每一个都由浏览器处理(或多或少同时),然后响应。所以当你的错误处理程序运行时,循环已经很久了。
顺便说一句,你的案例中的返回与错误处理程序有关,而不是循环内的函数。
所以,为了实现你想要的,你应该排队'您的AJAX请求并逐个执行。
一种可能的解决方案是创建一个表单数组然后从第一个表单中获取(并从数组中删除它),执行请求,在响应上重复整个事务,并继续重复直到数组为空。
答案 1 :(得分:1)
AJAX是异步的,当执行$ .each函数时,它将执行AJAX调用并且“不等待”其他人完成
要解决您的问题,您必须编写一个执行第一个ajax调用的函数,并且在成功时它将使用第二个ajax调用再次执行。
示例:
var data = [form1,form2...etc];
function letsLoop(data,index = 0){
$.ajax({
url:....
success: function(){
letsLoop(data,index+1);
},
error: function(){
}
});
}
在这里你打电话给你的功能:
letsLoop(data,0);