2014-02-26 74 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(); 
      } 
     } 
    }); 
})();