会递归“setTimeout”吗?函数调用最终会杀死 JS 引擎吗?

发布于 2024-11-25 09:07:27 字数 526 浏览 0 评论 0原文

假设我需要大约每 10 秒从服务器获取一些数据。我将有一个通过 AJAX 获取数据的函数,然后调用 setTimeout 再次调用该函数:

function GetData(){
   $.ajax({
       url: "data.json",
       dataType: "json",
       success: function(data){
         // do somthing with the data

         setTimeout(GetData, 10000);
      },
      error: function(){
         setTimeout(GetData, 10000);
      }
   });
}

如果有人整天打开网页,它可能会收到数千次递归函数调用。

我不想使用 setInterval 因为这没有考虑网络延迟。如果网络繁忙并且需要 15 秒来处理请求,我不想在获得 AJAX 超时之前再次询问。

处理需要定期调用的函数的最佳方法是什么?

Let's say I have some data that I need to get from the server about every 10 seconds. I would have a function that gets the data via AJAX and then call setTimeout to call this function again:

function GetData(){
   $.ajax({
       url: "data.json",
       dataType: "json",
       success: function(data){
         // do somthing with the data

         setTimeout(GetData, 10000);
      },
      error: function(){
         setTimeout(GetData, 10000);
      }
   });
}

If someone leaves the web page open all day, it could get thousands of recursive function calls.

I don't want to use setInterval because that does not take into account network delay. If the network is busy and it takes 15 seconds to process the request, I don't want to ask it again before I get the AJAX timeout.

What is the best way to handle a function that needs to be called periodically?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缺⑴份安定 2024-12-02 09:07:27

没有实际的递归,因为对 GetData 的调用被延迟,并且 JavaScript 上下文同时被破坏。所以它不会使 JS 引擎崩溃。

对于您的代码示例,这基本上是在 JS 引擎级别发生的事情:

  1. 初始化 JS 引擎
  2. 创建 GetData 函数上下文
  3. 执行包含“setTimeOut”的 GetData 语句
  4. “setTimeOut”指示 JS 引擎在 10 秒内调用函数
  5. 销毁 GetData 函数
  6. 上下文至此,就内存使用而言,我们又回到了步骤 1。唯一的区别是 JS 引擎存储了对函数的引用以及何时调用它(我们将此数据称为“futureCall”)。
  7. 10 秒后,从步骤 2 开始重复。“futureCall”被销毁。

There's no actual recursion because the call to GetData is delayed and the JavaScript context is destroyed in the meantime. So it won't crash the JS engine.

For your code sample, this is basically what will happen at the JS engine level:

  1. Initialize JS engine
  2. Create GetData function context
  3. Execute GetData statements including "setTimeOut"
  4. "setTimeOut" instruct the JS engine to call a function in 10 seconds
  5. Destroy GetData function context
  6. At this point, in terms of memory use, we are back to step 1. The only difference is that the JS engine stored a reference to a function and when to call it (lets call this data "futureCall").
  7. After 10 seconds, repeat from step 2. "futureCall" is destroyed.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文