javascript setInterval:调用重叠吗?

ren*_*ren 14 javascript setinterval

假设我有setInterval(PostToServer, 1000);.PostToServer函数使ajax发布,可能需要超过一秒钟.那么接下来会发生什么:在第一次呼叫未完成或等待呼叫结束之前进行第二次呼叫,然后再制作新呼叫?

jfr*_*d00 10

Javascript是带有事件队列的单线程(不包括此问题的HTML5 Web工作者).后续呼叫setInterval()将永远不会开始,直到上一次呼叫完成.一次只能有一个活跃.

当您的间隔时间发生时,JS引擎内部会启动计时器并将事件添加到javascript事件队列中.当当前运行的JS执行线程完成(而不是之前)时,JS引擎继续从事件队列中获取下一个事件并启动JS执行的线程.因此,JS中的两个执行路径将永远不会重叠或同时进行.因此,来自setInterval()的两个函数调用永远不会重叠.第二个在第一个完成执行之前不会启动.

但是,相对于你的问题,这意味着两个间隔从setInterval()不会重叠,但是如果你在第一个间隔计时器上进行异步ajax调用并且ajax调用的启动立即完成,并且第二个间隔触发在第一个异步ajax调用触发它的完成函数之前,你的ajax调用将会或可以重叠.

如果你想一次防止多个ajax调用正在进行中,你必须编写一些代码来专门防止这种情况,或者通过不触发第二个ajax调用直到前一个调用完成,或者只是跳过任何ajax调用前一个仍在继续.

有关JS事件队列及其工作原理的更多信息,请参阅此文章.


Rob*_*b W 8

电话重叠.

setInterval 确保定期运行功能,而无需等待以前的结果.

如果要等待响应,请将interval方法更改为轮询器.当时间已过并且服务器已经响应时,再次请求.

由于响应后服务器响应不会发生太大变化,因此您还可以setTimeout在AJAX方法的回调函数中添加处理程序.