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 我以正确的顺序得到消息“在关键部分” +索引和“超出关键部分” +索引,但是ajax请求仍在处理中。但是我收到具有相同索引的请求,我真的不知道在哪里查找问题。

javascript中的信号量或关键部分是否有任何内置功能?

最佳答案

没有信号灯或关键部分,因为JavaScript是单线程的。您进行的ajax调用是异步的,因此它启动了请求,然后愉快地继续前进并离开了关键部分。正如其他人提到的那样,一个简单的解决方案是使请求同步,但这违反了ajax的目的。

查看您的代码,似乎您正在尝试定期获取更新。如果是这种情况,为什么不在ajax请求的回调中安排下一个更新?

this.getMessages = function (){
    var url="getmessages.php?lastindex="+this.lastindex;
    $.getJSON(url,
        function(data){
            gup.lastindex=data.lastindex;
            $.each(data.updates, function(i,item){
                gup.addUpdate(item);
            });
  gup.updateTimer=setTimeout(gup.getMessages, 30);
        }
    );

}

这将消除对信号量的需求,并且更符合JavaScript的事件驱动性质。不利的一面是,更新没有按确切的间隔进行。同样,30毫秒似乎是一个非常短的间隔。

关于javascript - javascript关键部分或信号量问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2224245/

10-10 01:39