jquery ajax with async false挂起firefox

时间:2010-11-15 13:08:18

标签: jquery ajax firefox asynchronous

我有一个像这样调用$ .ajax的代码:

$.ajax({

                        type: "POST",
                        url: "/sandbox/graphloader/mock3",
                        async: false,
                        data: {calInput1:dates[0], calInput2:dates[1]},
                        success: function(data){
                            data=eval(data);
                            for(var x in data[0]){
                                //alert(data[0][x]);
                                //fill columns here;
                            }

                            fillPercents(column);
                        }});

现在,这适用于所有浏览器,而不是Firefox。 firebug显示它正在收到来自帖子的回复,但是由于某些未知错误,它没有显示数据。 可能是什么问题?

3 个答案:

答案 0 :(得分:10)

此行为是设计使然。

从不使用async: false 由于Javascript在UI线程上运行,async: false请求将冻结浏览器,直到服务器回复。

答案 1 :(得分:1)

它很冻结,因为它没有得到“成功”响应而你没有处理错误。在您的设置中设置error: function(jqXHR, textStatus, errorThrown){}以处理错误响应。 async: false工作正常。

答案 2 :(得分:0)

您的columns全局可能会被先前的AJAX请求覆盖。

尝试将其作为回调中的局部变量,并尝试添加console.log调用以确保回调顺序符合您的预期。


您可能需要保留一个全局请求计数器,以确保在发送新请求后不处理响应。

例如:

var lastRequest = 0;   //You may want to put this in a namespace or closure

...

var thisRequest = ++lastRequest;
$.ajax({
    type: "POST",
    url: "/sandbox/graphloader/mock3",
    async: false,
    data: {calInput1:dates[0], calInput2:dates[1]},
    success: function(data){
        if (thisRequest !== lastRequest) return;
        ...
    }});

请勿在循环体内执行此操作,否则您将共享thisRequest变量 相反,从循环体中调用一个函数。