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