如果用户多次单击元素,如何避免争用条件

How to avoid race condition if user clicks on the element multiple times?

本文关键字:何避免 争用条件 元素 单击 用户 如果      更新时间:2023-09-26

如果用户多次点击元素,如何避免竞争条件?我知道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 是一种单线程语言,所以,只要你的代码是顺序的,就没有竞争条件。

我通常会向元素添加一个类名,然后在事件处理程序中检查它并删除它在那里。它使您不必用变量污染全局空间。