Sincrónico. Cada uno con .ajax asynchronous

Me estoy rompiendo la cabeza leyendo todas las otras preguntas sobre este tema, pero parece que no puedo encontrar la mejor opción para mi código. Básicamente tengo un .each iterador que hace una function ajax asíncrona. Necesito que sea sincrónico sin bloquear los browseres, así que opté por no usar async: false .

Aquí está el código:

 $(".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); } } }); }); 

La única forma de hacer esto sin usar async: false es recurrir a devoluciones de llamada en lugar de un bucle .each() . Por ejemplo:

 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(); } } }); })();