下面的javascript完成了以下操作(对于node.js COMET应用程序来说):
向服务器发出
我关心的(我认为是有效的)是请求不断地添加到调用堆栈中,就像一个永远不会结束的递归函数。过了一段时间,它最终导致浏览器崩溃,变得没有响应(至少我认为这就是原因)。
我怎样才能完成同样的事情并避免这个问题呢?
function GetData(){
$.ajax({
url: "admin.html",
type: "POST",
dataType: "json",
contentType: 'text/json',
data: JSON.stringify({
cmd: "getData"
}),
timeout: (60 * 1000),
success: function(data, textStatus, jqXHR){
UpdateScreen(data);
GetData();
},
error: function(jqXHR, textStatus, errorThrown){
if(textStatus == "timeout"){
GetData();
}
}
});
}发布于 2011-09-21 23:57:24
不,我很确定你没事。ajax事件是异步的,因此GetData函数将完成,浏览器将等待事件,然后再从成功处理程序调用GetData。
把它看作是GetData函数,它只是定义要做什么,而不是实际执行。然后它完成执行(并清除堆栈),浏览器执行这些操作。
发布于 2011-09-22 00:08:41
function GetData(limit){
limit = limit || 0;
$.ajax({
url: "admin.html",
type: "POST",
dataType: "json",
contentType: 'text/json',
data: JSON.stringify({
cmd: "getData"
}),
timeout: (60 * 1000),
success: function(data, textStatus, jqXHR){
UpdateScreen(data);
GetData();
},
error: function(jqXHR, textStatus, errorThrown){
if(textStatus === "timeout" && limit < 20){
GetData(++limit);
} else {
//throw "epic fail"
setTimeout(GetData, 0);
}
}
});
}只需添加一个小的超时限制计数器。如果它太大,要么放弃并抛出一个错误,要么通过调用setTimeout来中断调用堆栈,这是异步的。
发布于 2011-09-22 00:24:00
我想知道您的UpdateScreen(数据)方法是否是问题所在。这也是一个递归函数吗?有人建议你简单地超时这个方法并不能解决这个问题,它只是中止了这个过程。我会尝试在您的成功和错误回调中记录类似于console.log(“获取数据成功”)和console.log(“获取数据错误”)之类的内容。如果日志页面中满是一条消息,那么您就知道GetData()方法是在哪里不断调用的。它可能总是超时。
另外,对于错误,您应该将if语句更改为
if(jqxhr.responseText == "timeout"){
getData();
}请参见此处解释原因:jQuery Ajax error handling, show custom exception messages
https://stackoverflow.com/questions/7508054
复制相似问题