私は大きなJSONオブジェクトを持っています。サーバーから戻ってきて、データテーブルを構築してフォームに表示しています。これには通常数秒かかります。ローディングバーを考えていました。 ローディングバーの後ろにロジックがありますが、hmtlデータを作成するループはブラウザをロックしているため、更新が必要な要素を呼び出すことはできません。ここでJavascriptでスレッディングする方法
はこれを行うに私の関数である。
function buildDataTable(db_table, container_id) {
var $pb = $("<div id=\"progress-bar\"></div>");
$(container_id).html($pb);
$pb.progressbar({
value: 0
});
$.post("post location", {
view: "all"
}, function (data) {
var headers = "";
var contents = "";
var jsonObject = $.parseJSON(data);
var tik = Math.round(jsonObject.length/100);
for (key in jsonObject[0]) {
headers += "<th>" + key.replace(" ", " ") + "</th>";
}
for (i in jsonObject) {
contents += "<tr>";
for (j in jsonObject[i]) {
contents += "<td class=\"border-right\">" + jsonObject[i][j] + "</td>";
}
contents += "</tr>";
if(Math.round(i/tik) == i/tik) {
/* if I run the alert (between popups) i can see the progressbar update, otherwise I see no update, the progressbar appears empty then the $(container_id) element is updated with the table i've generated */
alert('');
$pb.progressbar("value",i/tik);
}
}
var html = "<table cellpadding=\"5\" cellspacing=\"0\"><thead><tr>" + headers + "</tr></thead><tbody>" + contents + "</tbody></table>";
$(container_id).html(html);
$(container_id).children("table:first").dataTable({
"bJQueryUI": true,
"sScrollX": "100%"
});
});
}
JavaScriptはシングルスレッドです。処理中にGUIを更新できるように、 "setTimeout"を使用して作業を分割して順番に呼び出す必要がありますが、それでもブラウザはやや反応しないように見えます。 – maerics
アニメーションGIFを使用して実際の進捗状況を表示しない方がよいでしょうか? – rlemon
@maerics:非同期リクエストが新しいスレッドを開いたと思いましたか? – Anthony