12

これは、MediaWikiAPIクエリから返される結果の量をテーブルに入力するためのもの/api.php?action=query&list=querypage&qppage=BrokenRedirectsです。次に、結果の数がIDに追加されます(例:

// BrokenRedirects
$.getJSON('/api.php?action=query&list=querypage&qppage=BrokenRedirects&format=json', function (data) {
    $('#BrokenRedirects').text(data.query.querypage.results.length);
});

しかし、それがさらに7回繰り返されているので、qppageの引数を配列にし、forループを使用してコード全体を短縮しました。

var array = ['BrokenRedirects',
             'DoubleRedirects',
             'Unusedcategories',
             'Unusedimages',
             'Wantedcategories',
             'Wantedfiles',
             'Wantedpages',
             'Wantedtemplates'];

for (var i = 0; i < array.length; i++) {
    $.getJSON('/api.php?action=query&list=querypage&qppage=' + array[i] + '&format=json', function (data) {
        $('#' + array[i]).text(data.query.querypage.results.length);
    });
}

最初のループされていないバージョンが機能します。しかし、ループを追加したときは追加されませんでした。パーツは実行され$getJSONますが、結果のデータをIDに追加できません。私はそれをJSLintで実行しましたが、ループ内の関数について不平を言ったり、ほとんど助けが返されなかったと宣言var iしたりしました。var array私はJavaScriptに比較的慣れていないので、おそらく変数をループ内で2回使用することはできないと思いましたか?それ以外に、ループ内でIDを使用することと関係があるのでしょうか。

4

4 に答える 4

31

これは古典的な問題ですi。コールバックが呼び出されたときにループの終わりの値があります。

あなたはこのようにそれを修正することができます:

for (var i = 0; i < array.length; i++) {
    (function(i) { // protects i in an immediately called function
      $.getJSON('/api.php?action=query&list=querypage&qppage=' + array[i] + '&format=json', function (data) {
        $('#' + array[i]).text(data.query.querypage.results.length);
      });
    })(i);
}

2018年の補遺:

今日のブラウザには、もう1つのよりクリーンなソリューションがあります。let代わりに使用するvar

for (let i = 0; i < array.length; i++) {
    $.getJSON('/api.php?action=query&list=querypage&qppage=' + array[i] + '&format=json', function (data) {
        $('#' + array[i]).text(data.query.querypage.results.length);
    });
}
于 2013-03-11T20:16:16.253 に答える
3

for ループの代わりにJquery $.each()を使用して、配列を反復処理します。

例えば:

$.each(array, function(_, value) {
    var url = '/api.php?action=query&list=querypage&qppage=' + value + '&format=json';

    $.getJSON(url, function (data) {
        $('#' + value).text(data.query.querypage.results.length);
    });
});
于 2016-01-25T18:57:43.430 に答える
3

getJSON は非同期ajax 呼び出しです

REFER:同期 ajax 呼び出しを使用する

于 2013-03-11T20:36:36.913 に答える
0

次のような関数を書く必要があります-

function callUrl(value)
{
 $.getJSON('/api.php?action=query&list=querypage&qppage=' + value + '&format=json', function (data) {
        $('#' + value).text(data.query.querypage.results.length);
    });
}

そして、次のようなタイムアウトオプションで呼び出します-

setTimeout('callUrl(+ array[i] +)',500);ループ内 -

すなわち

for (var i = 0; i < array.length; i++) {
  setTimeout('callUrl(+ array[i] +)',500);
}

ここでは、呼び出しごとに多少の遅延が必要になります。

于 2013-03-11T20:22:41.047 に答える