我有一个Web应用程序,其中有一个不断倒计时的计时器.同时,客户端经常检查服务器以查看是否有更多时间添加到计时器.代码看起来像这样:
function tick() { // This function is called once every second time -= 1; redisplay(time); }; function update(newtime) { // This function is called whenever the ajax request // to the server yields a new time time = newtime; };
当然,它比这更复杂,但你可以看到固有的竞争条件.如果更新和滴答功能都试图同时修改time
怎么办?
坦率地说,我不太了解如何处理这种并发问题的javascript:是否有一种简单的方法可以做到这一点,或者如果没有,有人可以指向我可以了解更多信息的资源吗?
谢谢.
您没有竞争条件,因为Javascript不会同时执行.
每次从异步操作(AJAX setTimeout
等)触发回调时,该回调必须在另一个异步操作的另一个回调被调用之前完成执行.所以,如果update()
正在运行,没有其他Javascript.一旦update()
完成后,从异步操作之外的回调可发射(例如,tick()
).有趣的是,这也是为什么setTimeout
并不保证在达到超时的精确时刻执行的原因:其他一些javascript可能会阻止回调的执行.
查看http://ejohn.org/blog/how-javascript-timers-work/,了解有关这一切是如何工作的一些很好的信息.
Javascript是单线程的.没有竞争条件.在javascript中没有办法在两行中执行time = newtime;
并且time -= 1;
在执行期间重叠.实际上,这两个功能保证不会重叠.其中一个将运行,然后另一个将运行.