0

私はモジュール式の JavaScript を作成しており、大量の処理を行う特定の関数があります。2 つのキャンバスを描画し、多くの変数を更新してオブジェクト参照を保存します。ここで、上記で更新した変数のいくつかを使用する別の関数を実行したいと思います。

このようなもの:

  • Paint canvases - 画像の寸法を変数 (および他の多くのもの) に保存します
  • これらの寸法を使用して数学と幾何学を行い、キャンバスを再度更新してください! 最初の関数でこの計算を行うことはできません。これは、コードのどこでもキャンバスをペイントするために使用する一般的なユーティリティ関数であるためです。

コードにa を 10 秒間挿入するsetTimeoutと、すべて正常に動作しますが、それがないと、上記の 2 番目の命令は更新された変数を検出できず、失敗します。

これを回避する方法はありますか?つまり、必要な変数のいくつかが設定された後にのみ、2 番目の命令を実行したいと考えています。同期実行、と私は言います。

注:私の職場では許可されていないため、ここ(またはそのことについてはどこでも)にコードを投稿することはできません!

4

2 に答える 2

2

このような場合は、jQuery とカスタム イベントを使用することをお勧めします。最初の関数がキャンバスの更新を完了したときにイベントを投稿するだけです。2 番目の関数 (およびその他の関数) は、これらのイベントをリッスンして、必要なことを何でも実行できます。

プロ:

  • カップリングなし
  • 個々の部品は簡単にテストできます
  • 拡張可能

短所:

  • jQuery が必要です。または、イベント処理コードを抽出する必要があります。
于 2013-09-11T15:16:19.123 に答える
1

ゲッターとセッターを使用して、特定の条件を監視できます。
セッターでは、いくつかの計算を実行し、いくつかの条件が満たされているかどうかを確認し、必要に応じて更新できます。

アイデアを与えるために:

 // updateFunc is the function called whenever a property changes
 // and all conditions are met for an update.
 // newProp1,2,3 are the new values for prop1,2,3
 function MyStorageClass(updateFunc, newProp1, newProp2, newProp3 ) {
    this.updateFunc = updateFunc;
    this.prop1 = newProp1 ;
    this.prop2 = newProp2 ;
    this.prop3 = newProp3 ;
 }

 var MSCProto = MyStorageClass.prototype;

 // update is needed if all properties are >0
 MSCProto.checkUpdateRequired = function() {
   return ( ( this.prop1 > 0 ) && (this.prop2 > 0) && (this.prop3 > 0) )
 }

 Object.defineProperty(MSCProto, 'prop1', {  
        get : function() { retrurn this._prop1},
        set : function(x) { this._prop1 = x;  
                            // and some other computations if need be
                            if (this.checkUpdateRequired()) this.updateFunc(); } };

 Object.defineProperty(MSCProto, 'prop2', {  
        get : function() { retrurn this._prop2},
        set : function(x) { this._prop2 = x;  
                            // and some other computations if need be
                            if (this.checkUpdateRequired()) this.updateFunc(); } };      

 Object.defineProperty(MSCProto, 'prop3', {  
        get : function() { retrurn this._prop3},
        set : function(x) { this._prop3 = x;  
                            // and some other computations if need be
                            if (this.checkUpdateRequired()) this.updateFunc(); } };
于 2013-09-11T16:48:53.107 に答える