JavaScript 有没有类似 synchronized 的东东呢?

红薯 发布于 2011/09/28 16:32
阅读 2K+
收藏 1

Java 里有 synchronized 关键字可以用来显示某段代码库最多只允许一个线程访问。

JavaScript 有没有类似的机制呢?因为很多 ajax 操作都是异步的,这些异步操作的回调函数和页面上的一些用户操作行为,如果同时调用某个方法可能会有问题,因此寻求类似 synchronized 的解决方法。

加载中
1
scl33
scl33

引用来自“红薯”的答案

引用来自“ajavaloser”的答案

红薯大锅,我从来做过AJAX应用,也许没能很好理会你的意图,下面胡诌两句
我觉得JS是客户端的,而一般浏览器都是单进程,本质上不存在同步问题,你说的是控制服务器端的访问的话,在服务器那边做文章就行了,和JS没关系

问题出要出现在个人空间动弹,有时候会显示两条重复的数据,其实是同一条。

点击发布按钮时触发ajax请求,而页面本身也是用了 timer 每隔几秒钟检查是否有新动弹

当两种重叠的时候就会出现了同一条动弹显示两次的情况存在

红薯老大, 说的这个情况JQuery的AJAX没有任何处理, ExtJs的AJAX对此作了处理, 并针对无序请求提供了一个参数autoCancel, 如果设置成true, 则先提交而后返回的请求, 则直接抛弃.

场景: 当有序/无序请求1, 2, 3发送后, 由于异步, 返回顺序可能错位, 如果是无序的, 则可能出现结果重复.

ExtJs的处理, 每个请求记录得有transationId(AJAX请求时返回的ID), 作为请求标识, 放入请求池中, 返回的时候对应到请求, 获得当前请求对应信息(请求参数, 请求顺序, 等等..).

如果设置了autoCancel=true, 请求1,2,3顺序发送, 而返回顺序为3,2,1时, 2,1则直接抛弃, 不调用回调.

这个机制比较完整和复杂, 自己做的话, 个人认为, 弄个锁就好了, 请求后lock, 返回成功或失败unlock. 多次提交只接受第一次请求直到返回.

0
虫虫
虫虫

http://stackoverflow.com/questions/843058/javascript-synchronization-options

http://stackoverflow.com/questions/1076154/javascript-event-synchronization

0
大东哥
大东哥
老大也挖掘js了?这个需求,可以用个队列来模拟吧。
红薯
红薯
碰到了一些问题,我一向是就这问题去找答案:)
0
SeekerLee
SeekerLee
ajax有个sync,设置了以后,服务器返回结果之前,页面会假死。不知道是不是老大说的sync.
0
ajavaloser
ajavaloser

红薯大锅,我从来做过AJAX应用,也许没能很好理会你的意图,下面胡诌两句
我觉得JS是客户端的,而一般浏览器都是单进程,本质上不存在同步问题,你说的是控制服务器端的访问的话,在服务器那边做文章就行了,和JS没关系

0
红薯
红薯

引用来自“ajavaloser”的答案

红薯大锅,我从来做过AJAX应用,也许没能很好理会你的意图,下面胡诌两句
我觉得JS是客户端的,而一般浏览器都是单进程,本质上不存在同步问题,你说的是控制服务器端的访问的话,在服务器那边做文章就行了,和JS没关系

问题出要出现在个人空间动弹,有时候会显示两条重复的数据,其实是同一条。

点击发布按钮时触发ajax请求,而页面本身也是用了 timer 每隔几秒钟检查是否有新动弹

当两种重叠的时候就会出现了同一条动弹显示两次的情况存在

0xTang
0xTang
我发动弹的时候经常遇到。。
szmneo
szmneo
怎么才能出来这个情况呢?我咋测不出来…… 问题既然是发布的时候,那就发布时直接设置刚刚发布的不是新的动弹就行了吧
0
逝水fox
逝水fox

在一个ajax发送开始到响应结束(或者出错或者超时什么的)期间做个标记,不再提交其他的ajax请求。如果是必要的请求就把需要的数据和操作放在队列里面,上个响应结束后再做。如果只是定时显示用的刷新的话,就直接放弃这次请求等下次再刷新。

不知道这样能否实现。

ExtremeTalk
ExtremeTalk
我也是这么想的,只要取值和赋值操作是原子的就可以。
0
mark35
mark35
JS是单线程的啊~
0
ajavaloser
ajavaloser

我说的是我从没做过这方面的。。。。。。。打错字了

0
蛋疼的淡定哥
蛋疼的淡定哥
我都是控制节点的可用性来防止多次异步请求的
返回顶部
顶部