setTimeout 调用自身有什么问题吗?

Any issue with setTimeout calling itself?

我已经阅读了一些 setTimeout 问题,none 似乎与我想到的问题有关。我知道我可以使用 setInterval() 但这不是我的首选。

我有一个 Web 应用程序,理论上可以 运行ning 一天或更长时间而无需刷新页面,并且每分钟检查一次以上。 如果我的函数使用 setInterval 调用自身数百次(或更多次),我是否有可能被绊倒?例如,我会达到 "stack overflow" 吗?

如果我使用 setInterval,则极有可能同时出现两个请求 运行,尤其是在连接速度较慢的情况下(在第一个请求完成之前引发第二个请求)。我知道我可以创建标志来测试请求是否已经处于活动状态,但我担心误报。

我的解决方案是让一个函数调用我的 jquery ajax 代码,执行它的操作,然后作为 ajaxComplete 的一部分,它会执行 setInterval 以再次调用自身在 X 秒内。这种方法还允许我改变调用之间的持续时间,所以如果我的服务器很忙(慢),一个回复可以设置一个标志来增加 ajax 调用之间的时间。

我的想法的示例代码...

function ServiceOrderSync()
{   
    // 1. Sync stage changes from client with the server
    // 2. Sync new orders from server to this client
    $.ajax( {   "data": dataurl,
    "success": function(data)
            {   // process my data },
    "complete": function(data)
            {   
               // Queue the next sync
               setTimeout( ServiceOrderSync, 15000 );
            });

}

你不会得到堆栈溢出,因为调用不是真正的递归(我称之为 "pseudo-recursive")

JavaScript 是一种事件驱动语言,当您调用 setTimeout 时,它只是将一个事件排入待处理事件列表中,然后代码执行将从您所在的位置和调用继续在从该列表中拉出下一个事件之前,堆栈会完全展开。

p.s。如果您使用 jQuery 来处理异步代码,我强烈建议您使用 Promises。