假设我有
setInterval(PostToServer, 1000);
。 PostToServer
函数使ajax发布,这可能需要超过一秒的时间。那么会发生什么:在第一个呼叫尚未完成时进行第二个呼叫,或者在进行新呼叫之前等待呼叫结束?
通话重叠。
setInterval
确保函数定期运行,无需等待之前的结果。
如果要等待响应,请将间隔方法更改为轮询器。当时间过去并且服务器已经响应时,再次请求。
由于服务器响应在响应后不会立即发生太大变化,因此您还可以在 AJAX 方法的回调函数中添加
setTimeout
处理程序。
Javascript 是单线程的(不涉及此问题的 HTML5 Web Worker 除外),带有事件队列。 在前一个调用完成之前,来自
setInterval()
的后续调用永远不会开始。 一次只能有一个人处于活动状态。
当您的间隔时间到达时,JS 引擎内部的计时器将触发,并且事件将添加到 JavaScript 事件队列中。 当当前运行的 JS 执行线程完成时(而不是之前),JS 引擎会从事件队列中获取下一个事件并启动该 JS 执行线程。 因此,JS 中的两个执行路径永远不会重叠或同时进行。 因此,来自 setInterval() 的两个函数调用永远不会重叠。 在第一个执行完成之前,第二个不会启动。
但是,相对于你的问题,这意味着
setInterval()
中的两个间隔永远不会重叠,但是如果你在第一个间隔计时器上进行异步 ajax 调用并且 ajax 调用的开始立即完成,并且第二个间隔在第一个异步 ajax 调用触发其完成函数之前触发,然后您的 ajax 调用将或可以重叠。
如果您想阻止一次多个 ajax 调用,则必须编写一些代码来专门防止这种情况,要么在前一个 ajax 调用完成之前不触发第二个 ajax 调用,要么跳过任何 ajax 调用如果上一篇还在继续的话。
请参阅这篇文章,了解有关 JS 事件队列及其工作原理的更多信息。
是的,它重叠。您可以在 PostToServer 函数中使用
setTimeout
来确保它不会重叠,但问题是它运行请求,然后等待 1 秒,然后再次运行请求。所以它不会准确地每秒运行一次。
有关更多信息,请观看 Paul Irish 的视频:http://youtu.be/i_qE1iAmjFg?t=7m46s
是的,除非它们在不同的时间开始,并且不同的时间必须有一个小于或等于 setInterval() 时间除以您正在使用 setInterval() 的元素数量的差异:
setInteval(yourFunction,x)
setTimeOut(()=>{setInteval(yourFunction,x),y);
setTimeOut(()=>{setInteval(yourFunction,x),y +(max x/3));