setTimeout调用自身的任何问题

Any issue with setTimeout calling itself?

本文关键字:任何 问题 调用 setTimeout      更新时间:2023-09-26

我读过一些setTimeout问题,但似乎没有一个与我脑海中的问题有关。我知道我可以使用setInterval(),但这不是我喜欢的选项。

我有一个网络应用程序,理论上可以运行一天或更长时间,而不需要刷新页面,每分钟检查一次以上如果我的函数使用setInterval调用自己几百次(或更多次),我可能会被绊倒吗?例如,我会达到"堆栈溢出"吗

如果我使用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 );
            });
}

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

JavaScript是一种事件驱动的语言,当您调用setTimeout时,它只是在挂起事件列表中对一个事件进行排队,然后代码执行从您所在的位置继续,并且在从该列表中提取下一个事件之前,调用堆栈将完全展开。

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