我似乎无法突破A $ .each()循环

时间:2017-08-07 08:30:34

标签: javascript jquery ajax each

如果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;
        }
      });
    }
 });
}

2 个答案:

答案 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);