jquery ajax with async false挂起firefox

我有一个代码调用$ .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显示它正在收到来自post的回复,但是对于某些未知错误,它没有显示数据。 可能是什么问题?

此行为是设计使然。

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

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

您的全局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变量。
相反,从循环体调用函数。