事件处理程序中的JavaScript同步和关键部分

Mik*_* S. 7 javascript synchronization javascript-events

我有一个函数,它是一个事件处理程序websocket.onmessage,因为服务器可以发送多个消息(一个接一个),每个消息将触发该事件,并且因为功能块可能需要几秒钟(内部进行大量渲染) ),当第一个函数调用仍在运行时,可以再次调用该函数.在某些情况下,我需要在此函数中使用一个关键块,以便第二次调用仅在第一次调用结束时启动关键部分,这被认为是在JavaScript中实现锁定的"最佳实践"?

Geu*_*uis 4

由于js是单线程的,所以不能真正做锁。嗯,你可以,但你不应该

一种想法可能是保留状态变量。

您的函数将在每个 onmessage 上调用,但只有当变量设置为 false 时您才会执行某些操作。如果是这样,请将其设置为 true,完成后将其设置回 false。

var handler; //expose outside the closure
(function(){
    var busy = false;

    handler = function(){
        if( !busy ){
            busy = true;

            //do rendering stuff

            busy = false;
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

显然,请根据您自己的需要调整这个想法。