jquery-ajax与async-false挂起firefox
我有一个调用$.ajax的代码,如下所示:jquery-ajax与async-false挂起firefox,jquery,ajax,firefox,asynchronous,Jquery,Ajax,Firefox,Asynchronous,我有一个调用$.ajax的代码,如下所示: $.ajax({ type: "POST", url: "/sandbox/graphloader/mock3", async: false, data: {calInput1:dates[0], calInput2:dates[1]},
$.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
请求将冻结浏览器,直到服务器答复。您的列
全局可能会被以前的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
变量。相反,从循环体调用函数。它处于冻结状态,因为它没有得到“成功”响应,而且您还没有处理错误。在设置中设置一个
error:function(jqXHR、textStatus、errorshown){}
来处理错误响应async:false
工作正常。问题是firefox从未完成加载。我使用jquery ui来显示用ajax返回的数据填充的列,这些数据永远不会填充。如果在回调开始时调用console.log
或alert
会发生什么?您在Firebug中看到任何错误吗?ajax调用返回的数据类型是什么(即json、xml、html等)。。。你能给我一个样品吗。。。您的评估功能是否成功返回?警报响应。它只是没有填满数据。看起来它还挂着。。firebug中没有错误。在将async:false放入之前,数据已正确表示。传递的数据是来自php的json,这是一个多维数组。“直到服务器回复”是可以的。让它冻结。但是一旦服务器回复,它应该是正常的,对吗?不,不要让它冻结。这是最可靠的(好的,几乎是最可靠的)方法,可以让用户远离你的网站。。。好的,那我有一个新问题。在用户更改列上的日期后,我的ajax调用应该用来自服务器的数据填充4列。然后是对这些新数据的计算。我还将计算部分放在jquery的ajax调用的“success”函数中。但这些计算“有时”是根据旧数据进行的。我可以避免吗?您可能在服务器回复之前运行它们。你能展示你的代码吗?@Shrinath:传递函数要快得多。不要指望W3Coohls提供最佳实践。