2017-10-26 4 views
1

を失います実行フラグによって実行が許可されます。以下のようになります。私は、Chromeブラウザ上でこのコードを実行すると、それはmain.js.でprogram.execute()の呼び出しに到達することはありませんJavaScriptのシングルトンは、私が「program.js」で実装されているシングルトンパターンに問題がある参照

var program = null; 

function initDemo() { 
    program = Program.getProgram(); 
    program.init(); 
    runDemo(); 
}; 

function runDemo() { 
    if(program != null && program.run) { 
     program.execute(); 
    } 
    requestAnimationFrame(runDemo); 
}; 

プログラムの参照は、実行フラグをfalseに維持します。たとえinit()関数で変更されたとしてもです。私はデバッガでこれをすべて確認しました。私は 'this.run = true'コールが4つのコールバックにネストされていることを指摘しておきます。しばらくして、私はinit()関数を使ってmain.js内のプログラムのグローバル参照の実行フラグを変更することができたと考えました。したがって 'this.run = true'の代わりに 'program.run = true'の代わりに。これは動作し、ループはexecute()を実行します。しかし、これは私がOOPから使用したスタイルではありません。ここで実際に何が起こっていますか?コールバックとはまったく関係があります。私は 'this.run = true'をinit()の終了時にコールバックから外すと、フラグは正しく変更されますが、プログラムの実行が間違っています。

+0

は、あなたがどこでも ')' initDemo(呼び出しを見ることができませんか。 –

+0

'if(typeof instance!=" undefined "){' ここに_programを意味しますか? –

+0

申し訳ありませんが、私のソースからコードを書き直しました。私はコードを編集しました。 initDemo()関数はHTMLファイルのonloadと呼ばれます。 – SuperTasche

答えて

1

おそらくcallbackHellであなたのコールバックが非同期的に何かをやっているとprogram.runが実際にtrueに設定される前に遅延があり、シーケンスは、およそこのです:

  • あなたがあなたのコールバックが作業を開始
  • program.init()を呼び出します
  • runDemo()と、program.runfalseであり、それは存在します
  • コールバックfini SH自分の仕事とprogram.runはそれに対する解決策をので、あなたのメインのコードは次のようになります、あなたのrunDemoは別のコールバックするようにすることですtrue

次のようになります。

ここ
var program = null; 

function initDemo() { 
    program = Program.getProgram(); 
    program.init(runDemo); 
}; 

function runDemo() { 
    if(program != null) { 
     program.execute(); 
    } 
    requestAnimationFrame(runDemo); 
}; 

必要はありません全くprogram.runフラグは、代わりにあなただけの「callbackHell」の中から、あなたのデモを開始します。

Program.prototype.init = function(functionToRun) { 
    // the run call is nested in 4 callbacks 
    callbackHell (
     functionToRun(); // instead of setting program.run 
         // we call the specified function 
    ); 
}; 
関連する問題