如果用户多次单击元素,如何避免争用条件
How to avoid race condition if user clicks on the element multiple times?
如果用户多次点击元素,如何避免竞争条件?我知道Javascript是一种单线程语言。会不会有任何竞争条件发生?
如果是这样,我能想到的最好的办法就是在关键部分之前有一个标志。但从一般并发知识来看,如果 2 个线程一起进入第 3 行,仍然可能发生争用条件。
var isInProgress = false;
$('#target').click(function () {
if (isInProgress) {
console.log('In progress, skipping.');
return;
}
isInProgress = true;
// Critical section start
...
// Critical section end
isInProgress = false;
});
竞争条件可能会发生,主要是当程序员忘记异步函数(如 AJAX)时。这往往更多地发生在jQuery用户身上,但即使是Vanilla JS程序员也容易受到这个问题的影响(虽然完全不是我。不可能。我永远不会犯这个错误。不。-移涩的眼睛-)
话虽如此,在这种情况下,似乎没有任何竞争条件的可能性。要演示,请使用每个选项卡都有一个进程的浏览器(即不是 Firefox!),因为这会使它崩溃。
<button onClick="for(var i=0; i<1000000000; i++) alert('Clicked!');">Button</button>
由于单线程性,浏览器在发生单击事件时不会响应。
现在杀死浏览器选项卡。 你不庆幸你没有使用火狐吗? :p
正如你所说,Javascript 是一种单线程语言,所以不,只要你的代码是顺序的,就没有竞争条件。
我通常会向元素添加一个类名,然后在事件处理程序中检查它并删除它在那里。它使您不必用变量污染全局空间。
相关文章:
- 避免在用ng href加载样式表之前显示内容
- javascript/jquery-避免重复对条件求值
- 如何避免试图用php+jquery显示php起始页的无限循环
- Javascript-在检查对象属性是否存在时避免异步竞争条件
- 如果用户多次单击元素,如何避免争用条件
- 与 JQuery 的争用条件
- CSS 转换和转换结束事件的争用条件 - 找不到解决方案
- 在单元测试中获取数据时主干中的争用条件
- Ember嵌套路由模板,用条件HTML代替outlet
- RequireJS 定义浏览器争用条件
- Angular.js ng用条件重复
- 如何重写函数以避免jslint返回条件而不是赋值警告
- 是否有任何解决方法可以重新抛出异常并在Javascript中保留堆栈争用
- 用条件拆分JavaScript字符串
- 多指令资源争用'当创建自定义指令和使用ui引导时
- 用条件声明变量
- 用条件将属性从一个对象复制到另一个对象
- JavaScript数组争用条件/线程问题
- 可能的争用条件
- 用条件语句绑定模态窗口