2014-02-26 75 views
4

我打破了我的头阅读关于此主题的所有其他问题,但似乎无法找到我的代码的最佳选择。基本上我有一个.each迭代器,它执行异步ajax函数。我需要这个同步而不锁定浏览器,所以我选择不使用async: false同步。每个与异步.ajax

下面的代码:

$(".btn-timbrar").each(function(i, obj){ 
    $.ajax({ 
     type: 'POST', 
     url: "Home?opt=Recibo_G", 
     data: {id: $(obj).data("id"), p: pago}, 
     success: function(response){ 
      progress = progress + interval; 
      $barra.find("#progreso-global").width(progress); 
      $barra.find("#progreso-global").html(progress+"%"); 
      if(response.indexOf("timbrado con exito") != -1){    
       $(obj).parent().html('<a title="PDF" class="btn btn-recibo-info btn-mini" target="_blank" href="/ReciboVital/Home?opt=PDF&id='+$(obj).data("id")+'"><span class="glyphicon glyphicon-file"></span> PDF</a> <a title="XML" class="btn btn-recibo-info btn-mini" target="_blank" href="/ReciboVital/Home?opt=XML&id='+$(obj).data("id")+'"><span class="glyphicon glyphicon-download-alt"></span> XML</a> <a title="Enviar Correo" class="btn btn-recibo-info btn-mini btn-correo" href="/ReciboVital/Home?opt=Correo&='+$(obj).data("id")+'"><span class="glyphicon glyphicon-envelope"></span></a> <a title="Cancelar" class="btn btn-recibo-info btn-mini btn-correo" href="/ReciboVital/Home?opt=Cancelar&id='+$(obj).data("id")+'"><span class="glyphicon glyphicon-remove"></span></a>'); 
       $("#example thead th:eq(5)").width(150); 
      } 
     } 
    }); 
}); 
+2

为什么它需要同步?根据定义,同步操作“锁定”当前线程,因此不存在非阻塞同步操作。您应该使用jQuery承诺来确保在所有AJAX请求完成后都会执行一些操作 – CodingIntrigue

+1

看起来像是一个XY问题。那么为什么你需要这个同步?为什么不设置一个脚本服务器端,它将一次处理所有数据,然后只使用一个ajax调用?成功回调中的“obj”不是你的问题吗?如果使用任何类型的闭包,例如使用设置为'obj'的ajax请求的选项上下文,那么在成功回调中使用'this' –

+1

Q.您是否需要Ajax请求按顺序或全部并行运行? –

回答

0

要做到这一点,而无需使用async: false的唯一方式是诉诸回调,而不是一个.each()循环。例如:

var buttons = $(".btn-timbrar"); 

(function nextButton() { 
    var obj = [].pop.call(buttons); 
    $.ajax({ 
     type: 'POST', 
     url: "Home?opt=Recibo_G", 
     data: {id: $(obj).data("id"), p: pago}, 
     success: function(response){ 
      progress = progress + interval; 
      $barra.find("#progreso-global").width(progress); 
      $barra.find("#progreso-global").html(progress+"%"); 
      if(response.indexOf("timbrado con exito") != -1){    
       $(obj).parent().html('<a title="PDF" class="btn btn-recibo-info btn-mini" target="_blank" href="/ReciboVital/Home?opt=PDF&id='+$(obj).data("id")+'"><span class="glyphicon glyphicon-file"></span> PDF</a> <a title="XML" class="btn btn-recibo-info btn-mini" target="_blank" href="/ReciboVital/Home?opt=XML&id='+$(obj).data("id")+'"><span class="glyphicon glyphicon-download-alt"></span> XML</a> <a title="Enviar Correo" class="btn btn-recibo-info btn-mini btn-correo" href="/ReciboVital/Home?opt=Correo&='+$(obj).data("id")+'"><span class="glyphicon glyphicon-envelope"></span></a> <a title="Cancelar" class="btn btn-recibo-info btn-mini btn-correo" href="/ReciboVital/Home?opt=Cancelar&id='+$(obj).data("id")+'"><span class="glyphicon glyphicon-remove"></span></a>'); 
       $("#example thead th:eq(5)").width(150); 
      } 
      if(buttons.length > 0) { 
       nextButton(); 
      } 
     } 
    }); 
})();