假设我有setInterval(PostToServer, 1000);
。 PostToServer
函数生成ajax帖子,可能需要超过一秒钟。那么接下来会发生什么:在第一次呼叫未完成或等待呼叫结束之前进行第二次呼叫,然后再制作新呼叫?
答案 0 :(得分:8)
电话重叠。
setInterval
确保定期运行函数,而无需等待之前的结果。
如果要等待响应,请将interval方法更改为poller。当时间已过并且服务器已经响应时,再次请求。
由于服务器响应在响应后不会发生太大变化,因此您还可以在AJAX方法的回调函数中添加setTimeout
处理程序。
答案 1 :(得分:8)
Javascript是具有事件队列的单线程(除了此问题不涉及的HTML5 Web工作者)。来自setInterval()
的后续呼叫将永远不会开始,直到上一次呼叫完成。一次只能有一个活跃。
当您的间隔时间发生时,JS引擎内部定时器将触发,并且事件将添加到javascript事件队列中。当当前运行的JS执行线程完成(而不是之前)时,JS引擎继续从事件队列中获取下一个事件并启动JS执行的线程。因此,JS中的两个执行路径将永远不会重叠或同时进行。因此,来自setInterval()的两个函数调用永远不会重叠。第二个在第一个完成执行之前不会启动。
但是,相对于你的问题,这意味着来自setInterval()
的两个区间永远不会重叠,但是如果你在第一个区间计时器上进行异步ajax调用并且ajax调用的启动结束马上,第二个间隔在第一个异步ajax调用触发它的完成函数之前触发,然后你的ajax调用将会或可以重叠。
如果你想一次阻止一个以上的ajax调用,你必须编写一些代码来专门防止这种情况,或者通过不触发第二个ajax调用直到前一个调用完成,或者只是跳过任何一个ajax调用,如果前一个仍在继续。
有关JS事件队列及其工作原理的更多信息,请参阅this post。
答案 2 :(得分:2)
是的,它重叠了。您可以在PostToServer函数中使用setTimeout
以确保它不重叠,但问题是它运行请求然后等待1秒然后再次运行请求。所以它不会每一秒都完全运行。
有关更多信息,请参阅Paul Irish的视频:http://youtu.be/i_qE1iAmjFg?t=7m46s