【问题标题】:jQuery continue loop when ajax endsajax结束时jQuery继续循环
【发布时间】:2014-04-01 13:23:16
【问题描述】:

我有一个循环,我希望它在每次循环中的 ajax 结束时运行。
这可能吗?

for (var i=1;i if (keepruning = 1) {
持续运行 = 0;

$.post("getname.php", { id: myarr[i] } ) .done(函数(数据){ 持续运行 = 1 });

}

这是我得到的最接近的......但这不起作用。
任何帮助都会非常感激;

【问题讨论】:

  • ajax 中的 a 代表 asynchronous。这意味着它是非阻塞的,因此循环将在第一个请求完成之前完成。
  • 您希望循环从停止点继续运行吗?你想让循环运行还是什么?
  • 从它停止的那一点开始。就像一个“等待”功能。
  • 您需要设置中断/返回偏移或使用同步 ajax

标签: javascript jquery ajax loops for-loop


【解决方案1】:

jQuery ajax 默认是 {async:true} 所以请求剂量以前的请求响应 你应该使用$.ajax({...}) 而不是$.post 所以你可以在参数中添加{async:false} 喜欢

$.ajax({
   url : "xyz.php", 
   async : false,
   dataType : json
   success : function(data){
           //code here
   }
});

您也可以全局添加{async:false}

注意:这将适用于页面上定义的所有 ajax 函数

$.ajaxSetup({async:false});
【解决方案2】:

要按照您尝试的方式执行此操作,您需要一个递归函数,因为默认情况下 $.post 是异步的。

(function proceed(i) {
    $.post('getname.php', {id: myarr[i]}).done(function(data) {
        if (++i < 20) proceed(i);
    });
}(0));

但你应该在这样做之前考虑一下。难道简单的并行请求就不能解决问题吗?

您也可以提出同步请求,但我不建议这样做。

【讨论】:

  • 你不推荐异步请求?你将如何发出非异步的并行请求
  • 另外你想让i++ &lt; 20与op一致
  • 同步请求,我的朋友。
【解决方案3】:
for (var i=1;i<20;i++){
if (keepruning = 1) {
    keepruning = 0;

    $.ajax({
        url: "getname.php",
        type: "post",
        async: false,
        data:{ id: myarr[i] },
        success: function (data) {
            keepruning = 1;
        },
        error : function (data) {
            keepruning = 0;
        }
    });
}

}

这是一种方式,使用同步 ajax

【讨论】:

    【解决方案4】:

    使用async : false 冻结浏览器,这在用户体验方面不是一个好的解决方案。如果它适合您,您还可以使用自调用函数来执行循环:

    loop(0)
    function loop(i){
        $.post( "getname.php", { id: myarr[i] } ) .done(function(){
           if(i < 20) loop(i++)
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-11
      • 2021-11-13
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2011-08-19
      相关资源
      最近更新 更多