Объектно-ориентированная блокировка JavaScript - PullRequest
1 голос
/ 29 декабря 2011

Я дал ниже упрощенную задачу 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 Tag.[new Tag ()] Эти объекты совместно используют и модифицируют некоторые общедоступные данные, доступные в PROJ.

Я хочу предоставить доступ к общедоступным данным после снятия блокировки, выполнив Tag.Эта загрузка, упомянутая в setTimeout (), вызывает load () из PROJ.

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

Знаете ли вы, что JavaScript работает только в одном потоке? Блокировки (параллелизм) мало что делают, если ваша внутренняя loadConfig функция фактически не рекурсивна или не вызывает load каким-либо образом.

Обратите внимание, что я думаю, что у вас неверный синтаксис.

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

на самом деле делает это:

this.load(); // invoke load

if(lock)  loadConfig();
else      setTimeout(load,1000); 
1 голос
/ 29 декабря 2011

Я предполагаю, что код на самом деле выглядит так:

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 все еще работает. Это означает, что переменная lock не может быть false внутри load, если:

  1. В loadConfig есть оператор return, который возвращает выполнение до того, как lock будет установлено в true.
  2. В середине функции возникло исключение, и последняя строка никогда не выполняется.

В последнем случае вы можете использовать блок 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;
            }
        } 

Суть в том, что lock совсем не нужен и может быть полностью удален. load не может работать одновременно с loadConfig.

.
0 голосов
/ 20 марта 2013
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);

этот код демонстрирует ограничение частоты срабатывания события

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...