2016-05-14 10 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) 
} 

この2つの機能は、いつでも呼び起こすことができます。 しかし、実際にはsetIntervalとactualityフィールドを使うのは良い考えではないと思います。 この問題の解決策がありますか?

+0

代わりに、イベントリスナーを実装することをおすすめします。したがって、変更について知りたいコールバックを登録し、変更が行われた後にそれらのコールバックを呼び出します。 –

+0

@GerardvanHelden、サーバ上の別のリクエストハンドラにあるので、view_funcをcbに置くことはできません。また、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

提案ありがとうございます!このような方法で約束をするのはいい考えです。 –

関連する問題