2016-04-04 24 views
0

私は明確にできないWebアプリケーションからいくつかの動作が発生しています。エラーを発生させないように警告ラインを追加して実際にデバッグします。アラートを使用したデバッグはどのように解決できますか?

私は、コンテンツを表示する関数である "main"関数などのinitメソッドを持っています(aはグローバル変数で、名前空間の一部です) PS:私の最小限の例では、問題を引き起こしていた重要な部分が欠落していました。

a = undefined; 

init = function() { 
    if (a === undefined) { a = new A } //global variable 
    alert("1 - a gets defined"); 
} 

//method is part of A when A is constructed 
A.show = function() {...} 

//PS: the call to init() was part of a content-dependant method where init was skipped altogether when no content was loaded yet. 
updateContent = function(){ 
    if (noDataLoaded()) {return;} 
    init(); //PS: Init has been moved before the content check 
    performUpdatesAccordingToContent(); 
} 

main() { 
    updateContent(); 
    alert("2 - trying to display a"); 
    a.show(); 
} 

上記のように実行すると、警告1が表示され、警告2が表示され、getの内容が表示されます。 警告なしで実行した場合、次のエラーがアプリを壊し、スローされます。

TypeError: a is undefined 

文書readyイベントが私の知る限り、解雇されたと警告ラインがチェックするために追加された後にすべての関数が呼び出されます適切な実行順序。

質問はどのように警告線を追加すると、初期化の問題を解決することができますか?どのようにそれらなしでそれを解決するには?

+0

'new A'は_prototype_で' A'を初期化しますが、 'show'はコンストラクタで定義されているため継承されません。 'A.prototype.show = function(){...}'を使うと修正されますか?アラートはコードの実行に違いはないはずですから、他の方向でエラーを調べてください。 – somethinghere

+1

縮小した例を作成することは重要ですが、コードは無効で意味がありません。明らかに、これは 'alert()'で動作すると言っているので、あなたが実行しているものではありません。問題の実際の表現を投稿してください。 –

+1

アラートによってコードが変更された場合、ローカルファイルをロードするなどの非同期処理や角度やjqueryなどのライブラリを混在させるなど、タイミングの違いが生じるような場合には、考えられる唯一の理由が考えられます。私は同じことが私に起こったが、通常は警報が赤ちゃんであることが判明し、問題はイベントの順番である。 – Toby

答えて

0

@Damon、@Fat_Freddy、および@squintのおかげで、これまでに収集した内容に基づいています(最小限の例の完全性のためにコードパスを確認することは、実際にはソリューションの一部を考え出しました)。和解応答です。

アラートをデバッグするコードを使用すると、メインスレッドがユーザーの入力を待つ間に大きな遅延が発生します。これは、(私の場合は適切な初期化を許可する)ウィンドウの状態を変更するために、イベントキュー内のバックグラウンド作業に時間を与えることができます。一般に、アラートを追加するとWebアプリケーションの動作が変更された場合、バックグラウンドイベントの影響を受ける可能性のあるコンポーネントを探す必要があります。

アシスタントに影響する可能性のある非同期呼び出し(ajax)やイベントがキューに入れられていない場合、アラートはWebアプリケーションの動作を変更できません。

関連する問題