2011-09-21 61 views
1

下的javascript完成以下(这是一个node.js的COMET应用程序):如何避免重载JavaScript CallStack?

  1. 请求发送到服务器建立并保持到服务器有东西 回报。
  2. 一旦请求返回,处理数据并立即在 成功事件的回调函数内发出另一个 请求。
  3. 如果发生超时(服务器在时间范围内没有任何内容可以返回) 另一个请求在错误事件的回调函数内进行。

我的担心(我认为是有效的)是请求不断添加到callstack中,就像一个永不结束的递归函数。一段时间后,它导致浏览器最终崩溃,并变得没有反应(至少我认为这是原因)。

我该如何完成同样的事情并避免这个问题?

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(); 
      } 
     } 
    }); 
} 
+0

你检查出[socket.io(HTTP: //socket.io/)?可能对你的情况有用。 – Marshall

+0

不应该是'textStatus ==“超时”'? – jdigital

+0

@jdigital - 正确的抓住! –

回答

1

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

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

+0

对,忘了成功和错误事件是异步的。 Humm,还是不知道为什么浏览器崩溃... –

+0

这是正确的。异步回调可防止深度堆栈,因为调用函数在回调开始前完全退出。 –

+0

@Squeegy:太好了! - 谢谢澄清。 –

1
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来破坏调用堆栈。

0

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

在一个侧面说明,你应该改变你如果错误的东西像

if(jqxhr.responseText == "timeout"){ 
     getData(); 
    } 

在这里看到的解释,为什么声明:jQuery Ajax error handling, show custom exception messages