2016-05-14 70 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

感謝您的建議!以這種方式使用承諾是個好主意。 –