javascript - 同步 .each 与异步 .ajax

标签 javascript jquery ajax asynchronous

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

代码如下:

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

最佳答案

在不使用 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();
            }
        }
    });
})();

关于javascript - 同步 .each 与异步 .ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044100/

相关文章:

javascript - Json GET 未在弹出窗口中显示详细信息

javascript - 如何通过添加按钮动态添加选择框,然后通过php将值保存在mysql中

javascript - CORS 与 XMLHttpRequest 不起作用

javascript - 选择具有相同操作的不同js文件

javascript - jQuery - 只输出偶数

javascript - Jquery .on change() 命中 js.erb 文件中的所有选择字段

jquery - 如何避免由于太多ajax调用而导致浏览器出现内存不足错误

javascript - 带有 svg 和(双击)单击事件的 <object> 标签

javascript - 如何从 Meteor.js 中另一个模板的事件触发模板的 EventMap 事件?

javascript - DataLayer.push 不适用于外部 JavaScript