Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向对象JavaScript锁_Javascript_Oop - Fatal编程技术网

面向对象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;

我已经给出了以下简化的JavaScript问题

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所说,您的代码在语法上不正确,所以我们只能猜测您的问题。即使这是从一个更大的上下文中剪下的,请使其自我一致并在语法上正确,否则你得到的任何答案都将只是一个黑暗中的镜头。谢谢格罗!这是更好的解释:)谢谢格罗!这是更好的解释:)