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

时间:2012-09-21 19:56:20

标签: javascript javascript-events synchronization

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

3 个答案:

答案 0 :(得分: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;
        }
    }
})();

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

答案 1 :(得分:1)

你可以使用jQuery Socket https://github.com/flowersinthesand/jquery-socket,因为它有一个回复消息事件。

message(data, [callback])

这意味着您可以在完成第一条消息后获得下一条消息。

实施例

websocket.onmessage(data, function(){
  //get next message
});

答案 2 :(得分:0)

只有使用网络工作者时,JS才是多线程的。由于缺少可用的同步,我不知道是否允许在工作线程上使用websockets,但如果从主线程设置所有的websockets,则事件将在主线程上按顺序触发,所以你不需要必须自己执行任何阻止或同步(请参阅JS中的同步this thread