3
function myobj(){
  var gup=this;
  this.lastindex=-1;
  this.criticalSectionInTimer=0;
  this.updateTimer;

  this.start = function(l){
      if((typeof this.updateTimer)=="number"){
        clearInterval ( this.updateTimer );
      }
      this.updateTimer=setInterval(function() {gup.getMessages();} , 30);
    }

    this.stop= function(){
      if((typeof this.updateTimer)=="number"){
        clearInterval ( this.updateTimer );
      }  
    }

  this.addUpdate(i){
    //some code
  }

  this.rrrrnr=0;

  this.getMessages = function (){
    if(this.criticalSection==0){
       this.criticalSection=1;
      this.rrrrnr++;
      console.log("in critical section"+this.rrrrnr);
         var url="getmessages.php?lastindex="+this.lastindex;
         $.getJSON(url,
             function(data){
              gup.lastindex=data.lastindex;
              $.each(data.updates, function(i,item){
                gup.addUpdate(item);
              });
           }
         );
       console.log("out critical section"+this.rrrrnr);
       this.criticalSection=0;
    }
  }

}

var m= new myobj();
myobj.start();

上記のコードがあります。特定の時間間隔で更新を行うメインループがあります。問題は、変数 this.criticalSection で区切られた「クリティカル セクション」に入ることに気付きました。

firebug から、「in critical section」+ index および「out critical section」+index というメッセージを正しい順序で取得しますが、ajax リクエストはまだ処理中です。しかし、同じインデックスでリクエストを受け取りましたが、どこで問題を探すべきか本当にわかりません。

javascript にセマフォまたはクリティカル セクション用のビルトイン機能はありますか?

4

3 に答える 3

0

問題はかなり単純です。

定義上、非同期であるAJAXを使用しています。つまり、$。getJSONを実行すると、リクエストの処理中にjsが続行され、クリティカルセクションを終了します。したがって、最初の要求が完了する前に、getMessagesへのいくつかの呼び出しを実行できます。

このようなgetJSON呼び出しは非同期ではなく、終了するまでクリティカルセクション内でブロックされることを意図しているようです。これを行うには、asyncプロパティをfalseに設定する必要があります。これは次の行にあります。

$.ajax({
  dataType: 'json',
  url:  "getmessages.php?lastindex="+this.lastindex,
  type: 'GET',
  async: false,
  success: function(data){
      gup.lastindex=data.lastindex;
      $.each(data.updates, function(i,item){
          gup.addUpdate(item);
      });
});
于 2010-02-08T19:35:18.833 に答える
0

jQuery はデフォルトで AJAX Async を送信します。getJSON を試してみる:

$.ajax({
  dataType: 'json',
  url:  url,
  type: 'GET',
  async: false,
  success: function(data){
              gup.lastindex=data.lastindex;
              $.each(data.updates, function(i,item){
                gup.addUpdate(item);
              });
});
于 2010-02-08T19:33:26.933 に答える