如何在JavaScript中实现一个锁

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

如何lock在JavaScript中实现C#中的等价物?

所以,为了解释我在想一个简单的用例是:

用户点击按钮BB引发了一个onclick事件。如果B是在event-state事件等待B是在ready-state传播之前。如果B处于ready-stateB被锁定并被设置为event-state,则该事件传播。当事件的传播完成时,B设置为ready-state

我可以看到如何做到这一点,只需ready-state在按钮中添加和删​​除类。但是,问题在于用户可以更快地点击一行按钮两次,因此在某些情况下,锁定尝试失败。

有谁知道如何实现一个不会在JavaScript中失败的锁?

提问于
用户回答回答于

在JS中,锁定是一个值得怀疑的想法,其目的是为了无线程并且不需要并发保护。您正在寻找结合延期执行的调用。我遵循的模式是使用回调。像这样的东西:

var functionLock = false;
var functionCallbacks = [];
var lockingFunction = function (callback) {
    if (functionLock) {
        functionCallbacks.push(callback);
    } else {
        $.longRunning(function(response) {
             while(functionCallbacks.length){
                 var thisCallback = functionCallbacks.pop();
                 thisCallback(response);
             }
        });
    }
}

还可以使用DOM事件侦听器或pubsub解决方案来实现此功能。

用户回答回答于

除了少数例外情况(XMLHttpRequest onreadystatechangeFirefox的某些版本的处理程序),JavaScript是事件循环并发的。所以你不必担心在这种情况下锁定。

JavaScript有一个基于“事件循环”的并发模型。该模型与其他语言(如C或Java)中的模型完全不同。 ... JavaScript运行时包含消息队列,它是要处理的消息列表。每条消息都与一个函数关联。当堆栈为空时,将从队列中取出一条消息并进行处理。处理包括调用相关函数(从而创建初始堆栈帧)。当堆栈再次变空时,消息处理结束。 ... 在处理任何其他消息之前,每个消息都会被完全处理。在推理你的程序时,这提供了一些很好的属性,包括每当一个函数运行时,它不能被抢占,并且会在任何其他代码运行之前完全运行(并且可以修改该函数操纵的数据)。这与C不同,例如,如果某个函数在一个线程中运行,则可以在任何时候停止该函数以在另一个线程中运行其他代码。 这种模式的缺点是,如果消息需要很长时间才能完成,那么Web应用程序无法处理用户交互,如点击或滚动。浏览器通过“脚本运行时间过长”对话框缓解这种情况。遵循的一个好习惯是使消息处理简短,并且如果可能的话,将一条消息分成几条消息。

扫码关注云+社区