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