2011-12-29 4 views
1

下記のJavaScriptの問題を単純化しました。オブジェクト指向の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ロックを実装しようとしています。 3つのJavaScriptタグオブジェクトが作成されます。 [new Tag()]これらのオブジェクトは、PROJで使用できるいくつかのパブリックデータを共有および変更します。

タグを実行してロックが解除されたときにパブリックデータにアクセスする必要があります。 setTimeout()に記述されているこの負荷は、PROJのload()を呼び出しています。

+0

あなたはあなたのコードを修正する必要があります。構文エラーがあります(ブラウザで{{}}かっこが無視される可能性があります)、 'load'関数の定義はありません。 – Groo

+0

@UmeshはGrooとFelixKingの両方が述べているように、あなたのコードは構文的には正しくないので、あなたの問題についてしか推測できません。これははるかに大きな文脈から切り離されていますが、それを自己一貫性のあるものにするか、構文的に正しいものにするか、あなたが得る答えは暗闇の中で一撃になります。 – chuckj

答えて

1

私はコードが実際にこのようになっていることを前提としています:

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がシングルスレッドであるので、それはloadことは不可能ですloadConfigの実行中に呼び出される関数です。 trueに設定されているlock前に実行を返しloadConfigreturn文があり

  1. :これはlock変数はload内部falseであるためにしない限り、それは、不可能であることを意味します。
  2. 関数の途中で例外がスローされ、最後の行は決して実行されません。

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

    一番下の行は、lockができるすべてで必要とされていません:

後者の場合、あなたはlockは、例外の場合にリセットされていることを確認するtry/finallyブロックを使用することができます完全に取り除く。 loadConfigと同時に実行できる方法はありません。

+0

ありがとうグルー!それははるかに良い説明です:) –

3

JavaScriptは1つのスレッドでのみ動作することにご注意ください。内部のloadConfig関数が実際に再帰したり、何らかの形でloadを呼び出さない限り、ロック(同時実行性)はあまり効果がありません。

あなたの構文が間違っていると思います。

this.load(){ 
    if(lock) loadConfig(); 
    else  setTimeout(load,1000); 
} 

は、実際にこれをやっている:

this.load(); // invoke load 

if(lock) loadConfig(); 
else  setTimeout(load,1000); 
+0

与えられたコードは非常に単純化され、最小化されています。 JSでもシングルスレッドで動作し、複数のタグ(タグオブジェクト)が同時に実行されています。 –

+1

@Umesh:複数回!==並行して。 –

+0

@FelixKling、はい。私は、複数の(並行して)タグオブジェクトがここに作成されていると言いたい。ここで助けてもらえますか? –

0
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); 

これらのコードのデモイベントトリガの周波数限界

関連する問題