【问题标题】:I can't seem to break out of A $.each() loop我似乎无法摆脱 $.each() 循环
【发布时间】:2018-01-14 12:01:10
【问题描述】:

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

【问题讨论】:

  • 究竟是什么不正常?
  • 您的意思是,如果任何请求失败,您想提前退出each 迭代吗?它们当前是异步执行的,因此它们可能都在第一个返回之前发送
  • @PeterMader 我在 for 循环中使用了它,但发现每个循环都更好

标签: javascript jquery ajax each


【解决方案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);

【讨论】:

  • 很高兴我能帮上忙 :)
【解决方案2】:

如果跳出循环是指错误处理程序中的return,那么它不会像你想象的那样工作。

您的循环“立即”创建异步请求。然后这些请求中的每一个都由浏览器处理(或多或少同时),然后是响应。因此,当您的错误处理程序运行时,循环早已完成。

顺便说一句,您的情况下的返回与错误处理程序有关,而不是循环内的函数。

因此,要实现您想要的,您应该将 AJAX 请求“排队”并一一执行。

一种可能的解决方案是创建一个表单数组,然后获取(并从数组中删除)第一个表单,执行请求,在响应时重复整个过程,并继续重复直到数组为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多