我已经阅读了一些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 );
});
}
答案 0 :(得分:3)
你不会得到堆栈溢出,因为这个调用不是真正的递归(我称之为"伪递归")
JavaScript是一种事件驱动的语言,当你调用setTimeout
时,它只是在待处理事件列表中对一个事件进行排队,然后代码执行就会从你所处的位置继续,并且调用栈在完成之前就会被解除下一个事件从该列表中拉出。
P.S。如果您使用jQuery处理异步代码,我强烈建议您使用Promises。