私は現在、JavaScript / jQuery で統計を計算するスクリプトに取り組んでいます。そのため、多くの HTTP リクエストを実行し、DOM を解析し、変数値を変更するよう求めました。いくつかのエラーが発生しましたが、AJAX リクエストが非同期であることが原因ではないかと心配しています。
たとえば、StackOverflow で多くの質問を参照し、メンバーが表示される回数を評価したいとします。
次のようにコーディングします。
var users = {};
var checked_pages = 0;
function get_users(num_question) {
$.ajax({
url: "http://www.stackoverflow.com/questions/" + parseInt(num_question), // I Know that sometimes, the question is removed or the url redirects to an answer, but it does not matter, it is not the issue.
type: "GET",
success: function(data) {
var users_in_page = $(".user-details > a").map(function() { return $(this).text(); }).get(); // Users who appear in the page.
for (var i = 0; i < users_in_page.length; i++) {
if (isNaN(users[users_in_page[i]])) { // The user is not yet in the dictionnary.
users[users_in_page[i]] = 1;
} else {
users[users_in_page[i]] += 1;
}
}
checked_pages += 1;
if (checked_pages == 99) { // Every requests are made.
alert("END");
// Do something with my dictionary.
}
}
});
}
for (var i = 1; i < 100; i++) {
get_users(i);
}
私が恐れているのは、すべてのリクエストが非常に迅速かつ同時に行われるため、カウント エラーが発生し、最終的な辞書変数が歪んでしまう可能性があることです。
そのため、その前に関数でコールバックを使用しました。これにより、最終ループが置き換えられ、すべてが適切に実行されたことを確認できました。しかし、もちろん、それははるかに遅いです。
function get_users(num_question) {
...
num_question += 1;
get_users(num_question);
}
get_users(1);
私の最初の提案は、同時に AJAX リクエストを使用して、私が心配するほど問題を引き起こす可能性がありますか? 私はすでにこのようなスクリプトを作成しており、結果は奇妙であり、そこから来ているのだろうか...本当にそうである場合、変数と辞書の整合性を確保する方法はありませんか? 2 番目の関数よりも速くリクエストを増やしますか?