2016-12-08 4 views
-1

私は、ダッシュボードサイトを制作しており、SpringMVC、FusionCharts、およびBootstrap(アーキテクチャの概要を説明しています)を利用しています。私が新しくTomcatサーバーを起動すると、最初にインデックスページを提供したときに、一連のボタンが適切にレンダリングされません。私は3つのJavaScript関数の最初に作られた疑問符を含む白い円の正しい数を取得します。ページをリフレッシュすると、2番目のスクリプト機能によって生成された赤と緑の結果がすぐに表示されます。JavaScript HTMLレンダリングアウトオブシンク - Spring MVCプロジェクト

プリアンブルとして、ボタンが付いたパネルは、正しいカウント、正しい名前、正しいHREF、およびその他すべてで正しく生成されます。色は、ページがリフレッシュされるまで変化しません。このプロジェクトが最初に構築されたときに、データはhttpリクエストサーバー側で収集されていました。ファイルサーバー側からデータをロードし、同じ形式で送信することは、今起こっていることと比較して遅いです。古い方法では、10秒待ってから常に正しい色とアイコンが表示されます。今、ページをリフレッシュするまで、ボタンは空白のままです。その後、正しい結果が得られます。

私はJavaScriptがシングルスレッドであることを知っていますが、これは2つのJavascriptの機能が互いに踏み込んだ結果だと思います。もしそうでなければ、私は困惑して失われます。

Index.htmlと

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta charset="utf-8" /> 
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
<title>Free Bootstrap Admin Template : Dream</title> 
<!-- Bootstrap Styles--> 
<link href="css/bootstrap.min.css" rel="stylesheet" /> 
<!-- FontAwesome Styles--> 
<link href="css/font-awesome.css" rel="stylesheet" /> 
<!-- Morris Chart Styles--> 
<link href="js/morris/morris-0.4.3.min.css" rel="stylesheet" /> 
<!-- Custom Styles--> 
<link href="css/custom-styles.css" rel="stylesheet" /> 
<!-- Google Fonts--> 
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css' /> 

<script type="text/javascript" src="js/fusioncharts/core/fusioncharts.js"></script> 
<script type="text/javascript" src="js/fusioncharts/themes/fusioncharts.theme.fint.js"></script> 


</head> 
<body> 

... 

<!-- this is where the button panel is correctly created on every load 
    but only correctly modified on the 2nd load and later --> 
<div class="row"> <div id="AppStatusTable"></div> </div> 

... 

<script src="js/jquery-1.10.2.js"></script> 
<!-- Bootstrap Js --> 
<script src="js/bootstrap.min.js"></script> 
<!-- Metis Menu Js --> 
<script src="js/jquery.metisMenu.js"></script> 
<!-- Morris Chart Js --> 
<script src="js/morris/raphael-2.1.0.min.js"></script> 
<script src="js/morris/morris.js"></script> 


<!-- Custom Js --> 
    <!-- 
<script src="js/custom-scripts.js"></script> --> 
<script> 

    $(document).ready(function(){ 
     $.get("/buttoninfo", function(data, status) { 
      tableMaker(data, "AppStatusTable"); 
     }); 

     $.get("/appstatus", function(data, status) { 
      appStatus(data); 
     }); 

     $.get("/stackstatus", function(data, status) { 
      stackUpdater(data); 
     }); 

    }); 
</script> 
</body> 

これらの最後の3つの機能は、ボタンの動的な番号が含まれ、これらのボタンの内のHTMLを変更し、他のパネルを更新するために、パネルのHTMLに記入します。 3番目は現在しばらく時間がかかり、常に正しい結果が得られます。私はそれが問題だとは思わない。

dashboard.js

function templateLoader(appTag) { 
    //$.get('/app/' + appTag); 
    window.location = "/app/" + appTag; 
} 

function appStatus(data){ 

    for(var i = 0; i < data.length; ++i) { 
     if(data[i][1] == "up"){ 
      $("#" + data[i][0] + "-appcheck").removeClass("btn-default"); 
      $("#" + data[i][0] + "-appcheck").addClass("btn-success"); 
      $("#" + data[i][0] + "-appcheck-icon").removeClass("fa-exclamation-circle"); 
      $("#" + data[i][0] + "-appcheck-icon").addClass("fa-check"); 
     } else if(data[i][1] == "down"){ 
      $("#" + data[i][0] + "-appcheck").removeClass("btn-default"); 
      $("#" + data[i][0] + "-appcheck").addClass("btn-danger"); 
      $("#" + data[i][0] + "-appcheck-icon").removeClass("fa-exclamation-circle"); 
      $("#" + data[i][0] + "-appcheck-icon").addClass("fa-close"); 
     } 
    } 
} 

function tableMaker(data, tableID) { 

    /* vars used below as the skeleton of the injected buttons*/ 

    var i = 0, j = 0, colLimit = 12; 
    for(; i < data.length;){ 
     for (var j = 0; j < colLimit && i < data.length; ++j, ++i) { 
      mytable += colStart + data[i][2] + titleEnd + '\n' + buttonStart + data[i][2] + buttonMiddle1 + 
        data[i][2] + buttonMiddle2 + data[i][2] + buttonMiddle3 + '><i id="' + data[i][2] + 
        buttonEnd + colEnd; 
     } 
    } 

    panel += mytable + panelEnd; 

    document.getElementById(tableID).innerHTML = panel; 
} 

function stackUpdater(data){ 
    for(var i = 0; i < data.length; ++i){ 
     var curStack = data[i][0]; 
     for(var j = 1; j < data[i].length; j++) { 
      if(data[i][j] == null) { 
       break; 
      } else { 
       $("#" + curStack + j).removeClass("progress-bar-info"); 
       if(data[i][j] == "up") { 
        $("#" + curStack + j).addClass("progress-bar-success"); 
       } else { 
        $("#" + curStack + j).addClass("progress-bar-danger"); 
       } 
      } 
     } 
    } 
} 

私はブラウザを理解するには、JavaScriptの関数の結果をキャッシュしますが、第三の機能は、すべてのリフレッシュ上で実行されるので、なぜ最初の二つは、のではないでしょうか?したがって、2番目の関数の結果は、リフレッシュ後にのみ表示されるのはなぜですか?

このページが最初にロードされたときにボタンが正しく変更されるように変更する必要があるのは何ですか?

UPDATE 1

、関数呼び出しの間で最初の試行でのレンダリング作品をアラートを挿入した後、このようにすることなく、同期を確保するための正しい方法は何ですか? Index.htmlとの

下:代わりにfalseに設定されたキャッシュで$アヤックスを使用してみてくださいに.get $を使用しての

$(document).ready(function(){ 
     $.get("/buttoninfo", function(data, status) { 
      tableMaker(data, "AppStatusTable"); 
     }); 

     alert("Button table made!"); 

     $.get("/appstatus", function(data, status) { 
      appStatus(data); 
     }); 

     alert("Button Data Updated!"); 

     $.get("/stackstatus", function(data, status) { 
      stackUpdater(data); 
     }); 

     alert("Stack Data Updated!"); 

    }); 
</script> 
+0

この質問を削除することもできます。大量のコードダンプを実行しました。 – Snickers3192

+0

私は大量の70行の下では電話しません。フォーマットが整っていて、読みやすいです。 C++の質問のいくつかは、殺し屋のための300行の迷惑メールです。さらに、真剣に、アイデアはありませんか? – patrickjp93

+0

コードダンプは、あなたの問題に関連していないものをたくさん持っているということです。質問をする前に、すべてのコードを最小限の量に絞り込んで問題を示す時間を取る必要があります。とにかくこれはSpringと何が関係していますか? – Snickers3192

答えて

0

。 $ .getが絶対必要な場合は、リクエストごとにタイムスタンプを追加してみてください。 How to set cache: false in jQuery.get callを参照してください。

願っています。

+0

私はその理由について多くのことをしています。なぜこれが問題を解決するのだろうか?それは必ずしも必要ではありません。私は、JavaScriptとWeb開発の初心者であり、私が最大限に活用しようとしている仕事です。 おそらくJSコードスタイルが示すように、私はバックエンドの背景から来ています。 – patrickjp93

+0

私はappstatus関数に90msの遅延を入れて一時的な修正を実装しました。うまくいけば、ファイルからロードするためにstackstatusを変更した後、関数呼び出しの順序を変更するだけで、このレースの問題は解決されます。 AWSにデプロイされると、それ自体が解決されるだけで、伝播の遅延はいつでもあります。 – patrickjp93

+0

3つの関数がdocument.readyイベントで実行されているため、それぞれにコールバック付きのajax呼び出しが必要なため、コールバックの再初期化が必要です。 – sbanerjee

関連する問題