首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免重载JavaScript CallStack?

如何避免重载JavaScript CallStack?
EN

Stack Overflow用户
提问于 2011-09-21 23:54:50
回答 3查看 1.1K关注 0票数 1

下面的javascript完成了以下操作(对于node.js COMET应用程序来说):

向服务器发出

  1. 请求,并将其保存到服务器有返回内容为止。一旦请求返回,
  2. 将处理数据,并在成功事件的回调函数中立即发出另一个请求。如果发生超时(服务器在时间范围内没有任何返回),则在错误事件的回调函数中提出另一个请求。

我关心的(我认为是有效的)是请求不断地添加到调用堆栈中,就像一个永远不会结束的递归函数。过了一段时间,它最终导致浏览器崩溃,变得没有响应(至少我认为这就是原因)。

我怎样才能完成同样的事情并避免这个问题呢?

代码语言:javascript
复制
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();
            }
        }
    });
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-21 23:57:24

不,我很确定你没事。ajax事件是异步的,因此GetData函数将完成,浏览器将等待事件,然后再从成功处理程序调用GetData

把它看作是GetData函数,它只是定义要做什么,而不是实际执行。然后它完成执行(并清除堆栈),浏览器执行这些操作。

票数 1
EN

Stack Overflow用户

发布于 2011-09-22 00:08:41

代码语言:javascript
复制
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来中断调用堆栈,这是异步的。

票数 1
EN

Stack Overflow用户

发布于 2011-09-22 00:24:00

我想知道您的UpdateScreen(数据)方法是否是问题所在。这也是一个递归函数吗?有人建议你简单地超时这个方法并不能解决这个问题,它只是中止了这个过程。我会尝试在您的成功和错误回调中记录类似于console.log(“获取数据成功”)和console.log(“获取数据错误”)之类的内容。如果日志页面中满是一条消息,那么您就知道GetData()方法是在哪里不断调用的。它可能总是超时。

另外,对于错误,您应该将if语句更改为

代码语言:javascript
复制
   if(jqxhr.responseText == "timeout"){
      getData();
   }

请参见此处解释原因:jQuery Ajax error handling, show custom exception messages

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7508054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档