【问题标题】:jQuery ajax in each loop每个循环中的 jQuery ajax
【发布时间】:2016-07-21 17:11:13
【问题描述】:

我在 $.each 循环内获取成功函数 (ajax) 中的值时遇到问题。

我有这样的东西:

var test = [];
$.each(images, function(index){
    var formData = new FormData();
    formData.append('image', images[index]);

    $.ajax({
        url: 'http://localhost/admin/api/offers/upload_photo',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        beforeSend: function(){
            console.log(test.length);               
            test.push(images[index]);       
        },
        success: function(){
            console.log(test.length);
        }
    });
});  

并且 beforeSend 的输出工作正常(控制台日志:0、1、2),但另一个返回三倍 3(控制台日志:3、3、3)。其余的工作没有问题,我只是在努力。有谁能帮助我吗?谢谢!

【问题讨论】:

  • 似乎它正在做它应该做的事情。
  • 您的each 循环似乎在任何success 函数触发之前完成。因此,当success 触发其中一次迭代时,循环已经完成,test 的长度为三。这可能会提供信息:How do I return the response from an asynchronous call?
  • 这就是为什么 ajax 是异步的 :) 顾名思义 :)
  • 这种行为似乎合乎逻辑且符合预期。你想让代码做什么?

标签: jquery ajax loops each


【解决方案1】:

AJAX 请求默认是异步的。这意味着它将请求发送到服务器,但在继续执行代码之前不会等待响应返回。所以$.each() 循环发送所有三个AJAX 请求,并立即执行它们所有的beforeSend: 函数。 success: 函数在响应被处理之前不会执行,直到您的代码返回到主浏览器事件循环。

由于所有beforeSend: 函数在处理任何响应之前执行,test 数组将在success 函数执行时填充所有图像。所以他们都会看到test.length == 3。

【讨论】:

  • 谢谢,我了解了 AJAX 请求的确切工作原理并达到了我的目标。
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多