面向对象JavaScript锁
我已经给出了以下简化的JavaScript问题面向对象JavaScript锁,javascript,oop,Javascript,Oop,我已经给出了以下简化的JavaScript问题 var PROJ=(function(){ var tags={}, var lock=true; function onLoadComplete(){} this.Tag = function(userConfig,callBack){ function loadConfig(){ lock=false;
var PROJ=(function(){
var tags={},
var lock=true;
function onLoadComplete(){}
this.Tag = function(userConfig,callBack){
function loadConfig(){
lock=false;
/* Do something privately having lock with me */
lock=true;
}
this.load(){
if(lock) loadConfig();
else setTimeout(load,1000);
// PROBLEM is this(above) load is calling OUTER load..!
}
return this;
};
this.load(){
var cb=onLoadComplete;
tags[uniqueID]=new Tag(userConfig,cb);
tags[uniqueID].load();
}
}).load();
我试图在这里实现JavaScript锁。创建了三个JavaScript标记对象。[new Tag()]这些对象共享和修改项目中可用的一些公共数据
我希望在通过执行标记释放锁后,能够访问公共数据。setTimeout()中提到的这个加载正在调用PROJ的load()。您知道JavaScript只在一个线程中运行吗?锁(并发)没有多大作用,除非您的内部
loadConfig
函数以某种方式实际递归或调用load
请注意,我认为您的语法错误
this.load(){
if(lock) loadConfig();
else setTimeout(load,1000);
}
实际上是这样做的:
this.load(); // invoke load
if(lock) loadConfig();
else setTimeout(load,1000);
您知道JavaScript只在一个线程中运行吗?锁(并发)没有多大作用,除非您的内部
loadConfig
函数以某种方式实际递归或调用load
请注意,我认为您的语法错误
this.load(){
if(lock) loadConfig();
else setTimeout(load,1000);
}
实际上是这样做的:
this.load(); // invoke load
if(lock) loadConfig();
else setTimeout(load,1000);
我认为代码实际上是这样的:
this.Tag = function(userConfig,callBack){
function loadConfig(){
lock=false;
/* Do something privately having lock with me */
lock=true;
}
this.load = function(){
if(lock) loadConfig();
else setTimeout(load,1000);
}
return this;
};
由于JavaScript是单线程的,因此当loadConfig
仍在运行时,不可能调用load
函数。这意味着lock
变量在load
内部不可能是false
,除非:
loadConfig
中有一个return
语句,它在lock
设置为true
之前返回执行try/finally
块确保在出现异常时重置lock
:
function loadConfig(){
try {
lock=false;
/* Do something privately having lock with me */
}
finally {
// this will get executed even if an exception is thrown
lock=true;
}
}
底线是,
锁
根本不需要,可以完全移除。load
无法与loadConfig
同时运行,我推测代码实际上如下所示:
this.Tag = function(userConfig,callBack){
function loadConfig(){
lock=false;
/* Do something privately having lock with me */
lock=true;
}
this.load = function(){
if(lock) loadConfig();
else setTimeout(load,1000);
}
return this;
};
window.setMinInterval=function(callback, delay){
var lock=false;
return function(){
if(lock){return;}
lock=true;
setTimeout(function(){lock=false;}, delay);
callback.apply(this, Array.prototype.slice.call(arguments, 0));
};
};
var mousemoveHandler=function(event){
document.title=event.clientX+","+event.clientY;
};
window.onmousemove=setMinInterval(mousemoveHandler,500);
由于JavaScript是单线程的,因此当loadConfig
仍在运行时,不可能调用load
函数。这意味着lock
变量在load
内部不可能是false
,除非:
loadConfig
中有一个return
语句,它在lock
设置为true
之前返回执行try/finally
块确保在出现异常时重置lock
:
function loadConfig(){
try {
lock=false;
/* Do something privately having lock with me */
}
finally {
// this will get executed even if an exception is thrown
lock=true;
}
}
底线是,锁
根本不需要,可以完全移除。load
无法与loadConfig
同时运行
window.setMinInterval=function(callback, delay){
var lock=false;
return function(){
if(lock){return;}
lock=true;
setTimeout(function(){lock=false;}, delay);
callback.apply(this, Array.prototype.slice.call(arguments, 0));
};
};
var mousemoveHandler=function(event){
document.title=event.clientX+","+event.clientY;
};
window.onmousemove=setMinInterval(mousemoveHandler,500);
这些代码演示事件触发频率限制
这些代码演示了事件触发频率限制给出的代码非常简化和最小化。即使JS在单线程中运行,也会创建同时运行的多个标记(标记对象)。@Umesh:多次!==费利克斯克林,是的。我想说的是,这里创建了多个(并发)标记对象。您能在这里提供帮助吗?@Umesh:但正如Lucero所说,JavaScript是单线程的,因此JavaScript代码不能同时运行,除非您使用例如web workers,即使这样,它们也不能在相同的对象上工作。@Umesh,除非您以某种方式“手动”运行在
标记
功能内创建新的标记
实例,代码不会重新输入。修复您的此问题。请先加载函数声明(?),然后再试一次,这里的并发性不是问题。给出的代码非常简单,并且最小化。即使JS在单线程中运行,也会创建同时运行的多个标记(标记对象)。@Umesh:多次!==费利克斯克林,是的。我想说的是,这里创建了多个(并发)标记对象。您能在这里提供帮助吗?@Umesh:但正如Lucero所说,JavaScript是单线程的,因此JavaScript代码不能同时运行,除非您使用例如web workers,即使这样,它们也不能在相同的对象上工作。@Umesh,除非您以某种方式“手动”运行在标记
功能内创建新的标记
实例,代码不会重新输入。修复此问题。请先加载函数声明(?),然后重试,并发性在这里不是问题。您应该修复代码。有语法错误(那些{}
括号可能会被浏览器忽略,所以您看不到),并且没有定义加载
函数。@Umesh正如Groo和FelixKing所说,您的代码在语法上不正确,所以我们只能猜测您的问题。即使这是从一个更大的上下文中截取的,请使其自我一致并在语法上正确,否则你得到的任何答案都将只是一个猜测。你应该修复你的代码。有语法错误(那些{}
括号可能会被浏览器忽略,所以您看不到),并且没有定义加载
函数。@Umesh正如Groo和FelixKing所说,您的代码在语法上不正确,所以我们只能猜测您的问题。即使这是从一个更大的上下文中剪下的,请使其自我一致并在语法上正确,否则你得到的任何答案都将只是一个黑暗中的镜头。谢谢格罗!这是更好的解释:)谢谢格罗!这是更好的解释:)