6

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

4

3 回答 3

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;
        }
    }
})();

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

于 2012-09-21T20:05:22.563 回答
1

您可以使用 jQuery Socket https://github.com/flowersinthesand/jquery-socket,因为它具有消息事件的回调。

message(data, [callback])

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

例子:

websocket.onmessage(data, function(){
  //get next message
});
于 2012-09-21T20:15:29.330 回答
0

仅当您使用 webworkers 时,JS 才是多线程的。由于缺乏可用的同步,我不知道是否甚至允许在工作线程上使用 websocket,但是如果您从主线程设置所有 websocket,事件将在主线程上按顺序触发,所以您不要必须自己执行任何阻塞或同步(请参阅JS 中的同步这个线程)

于 2012-09-21T20:07:40.033 回答