使用Ajax同步重新排序Javascript代码:false

使用Ajax同步重新排序Javascript代码:false,javascript,ajax,Javascript,Ajax,我有一个启动ajax调用的按钮单击事件,我需要ajax调用是同步的,所以我将async:false设置为。我想向用户提供反馈,让他们知道ajax调用发生在后面。因此,我有以下几点: $('#ajaxBtn').on("click",function() { $('#ajaxBtn').html("processing ..."); $.ajax({ type: "Get", url: "example.php?data=test",

我有一个启动ajax调用的按钮单击事件,我需要ajax调用是同步的,所以我将async:false设置为。我想向用户提供反馈,让他们知道ajax调用发生在后面。因此,我有以下几点:

$('#ajaxBtn').on("click",function() {
    $('#ajaxBtn').html("processing ...");
    $.ajax({
        type: "Get",
        url: "example.php?data=test",
        async: false,
        success: function(){
            alert("success");
        },
        error: function(){
            alert("failure");
        }
    })
}
在Chrome上(没有在其他浏览器上测试过),当我单击按钮时,所有内容都会在ajax调用完成时冻结,但是按钮上的文本直到成功警报弹出后才会更新。如果我在调试器中单步执行代码,它将按预期工作。按钮上的文本在ajax调用启动之前更改

如果我将Async设置为true,它似乎也能按预期工作。文本立即更改,然后我进入成功函数


Chrome是否会在更改文本之前对ajax调用进行重新排序?为什么我会看到这个?

像这样的东西怎么样

$('#ajaxBtn').on("click",function() {

    $.ajax({
        type: "Get",
        url: "example.php?data=test",
        //note that I have removed the async: "false",
        beforeSend:function(){
             $('#ajaxBtn').html("processing ...");
        },
        success: function(){
            alert("success");
        },
        error: function(){
            alert("failure");
        }
    }).done(function(data){
        //submit your form here depending on which data is returned

    });
}

不要使用
async:false
。相反,请修复代码以处理异步请求。承诺是有帮助的。这种行为是故意的。同步操作会阻止UI线程。jQuery文档中写道:“请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作”。很不清楚为什么需要使用synchro调用,而避免使用synchro调用是一种很好的做法。@mart首先,除非Chrome对命令重新排序,否则我会在ajax调用之前更改文本。其次,我不想使用同步调用,但我这样做是因为这个单击提交了一个表单,但这只取决于ajax调用的成功与否。我认为SLaks关于承诺的评论可能会帮助我避免这种情况。你能提供你的代码的表单submitwith async:false吗,即使beforeSend似乎没有运行。基本上,只要发出ajax调用,dom就会冻结。这显然是故意的。