2016-05-14 4 views
0

Иногда на сервере у меня возникает ситуация, когда необходимо получить некоторые данные из объекта за время, когда оно изменяется другим фрагментом кода. Очень важно иметь актуальное состояние объекта во время просмотра объекта. Я решил эту проблему следующим образом:js, мониторинг состояния объекта

var Obj1={} 
Obj1.actual=false; 

//asynk part that modifies object 
function modify_func(){ 
    Obj1.actual=false; 
    //modifying operations 
    Obj1.actual=true; 
} 

//asynk part that gets object state 
function view_func(){ 
    if(Obj1.actual){ 
     //operations 
      ... 
     return; 
    } 
    //if not actual 
    var timer=setInterval(function(){ 
     if(Obj1.actual){ 
      //operations 
      ... 
      clearInterval(timer) 
     } 
    },1000) 
} 

Эти две функции могут быть пробуждены в любое время. Однако, я действительно не думаю, что было бы неплохо использовать поле setInterval и actuality. Есть ли лучшее решение этой проблемы?

+0

Я предлагаю вам внедрить прослушиватель событий для этого. Поэтому зарегистрируйте любой обратный вызов, который хочет узнать об изменениях, и вызовите эти обратные вызовы после внесения изменений. –

+0

@GerardvanHelden, я не могу поместить view_func в cb, потому что он находится в отдельном обработчике запросов на сервере и может выполняться 1000 раз, тогда как modify_func только 10, например, или наоборот –

ответ

2

Вы можете использовать Promise для этого случая. Как это должно быть структурировано, зависит от вашего фактического использования.

Описана установка может выглядеть следующим образом:

Obj1 = {}; 

//async part that modifies object 
function modify_func() { 

    //at this point you might need to check if modifying is already in progress. 

    Obj1._modifying = new Promise(function(resolve, reject) { 
    //modifying operations 

    delete Obj1._modifying; 
    resolve(); 
    }); 
} 

function view_func() { 
    if (Obj1._modifying) { 
    Obj1._modifying.then(_view_fun_internal); 
    } else { 
    _view_fun_internal(); 
    } 

} 

function _view_fun_internal() { 
    //do some stuff on the ready object 
} 

Но быть наградой, что это будет работать только хорошо, если сбор данных в _view_fun_internal является синхронизация.

+0

Спасибо за предложение! Это отличная идея использовать обещание таким образом. –

Смежные вопросы