2013-03-11 22 views
8

Dies ist eine Tabelle mit der Menge der Ergebnisse, die von der MediaWiki-API-Abfrage /api.php?action=query&list=querypage&qppage=BrokenRedirects zurückgegeben werden. Die Anzahl der Treffer wird dann beispielsweise auf die ID, hinzugefügt:

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

Aber es ist eine andere als 7 Mal wiederholt werden, habe ich die Argumente für qppage in ein Array und verwenden eine for-Schleife Gesamtcode zu verkürzen.

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); 
    }); 
} 

Die erste, unlooped, Version funktioniert. Aber als ich eine Schleife hinzufügte, tat es das nicht. Der $getJSON-Teil wird ausgeführt, aber die resultierenden Daten werden dann nicht zur ID hinzugefügt. Ich lief es durch JSLint, die abgesehen von sich beschweren über Funktionen in einer Schleife und var i mit var array zurückgegeben wenig Hilfe zurückgegeben. Ich bin relativ unerfahren mit Javascript also gedacht vielleicht eine Variable kann nicht zweimal innerhalb einer Schleife verwendet werden? Abgesehen davon, vielleicht etwas mit der Verwendung einer ID innerhalb einer Schleife zu tun?

+0

mögliches Duplikat [Verwendung SetTimeout und eine ganze Zahl in einem for-Schleife] (http://stackoverflow.com/questions/13731759/using-settimeout-and-an-integer- in-a-for-loop) –

+0

mögliches Duplikat von [Javascript closure in loops - einfaches praktisches Beispiel] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Bergi

+0

getJSON ist ein asynchroner Aufruf REFER: [Verwendung synchroner ajax Anrufe] [1] [1]: http://stackoverflow.com/questions/3419026/jquery-getjson-funktion-timing-issue – Girish

Antwort

23

Das ist ein klassisches Problem: i hat den Wert von Ende der Schleife, wenn der Rückruf aufgerufen wird.

Sie können es wie folgt beheben:

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); 
} 
+1

Danke, das hat es behoben – Onei

+1

WOW! Du bist großartig, aber JavaScript ....Ich bevorzuge wirklich Java '' final' Mechanismus, viel intuitiver zu mir –

+0

@dystroy Entschuldigung, jetzt akzeptiert :) – Onei

0

Sie eine Funktion wie schreiben sollte -

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

und es dann mit einem gewissen Timeout Option nennen wie -

setTimeout('callUrl(+ array[i] +)',500); innerhalb der Schleife -

dh

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

Einige Verzögerung für jeden Anruf wird hier benötigt.

1

getJSON ist ein asynchroner ajax Anruf

REFER: use synchronous ajax calls

+0

Ich habe synchrone Ajax-Anrufe untersucht, aber jemand hat darauf hingewiesen, dass jeder Anruf nur ausgeführt wird, nachdem der vorherige Anruf beendet wurde, wobei jeder Anruf zwischen 0,5 und 1 Sekunde dauert. Da im Skript 8 Aufrufe ausgeführt werden, dauert es etwa 8 Sekunden, bis das Skript geladen ist. Die Leute werden sich fragen, ob es überhaupt geladen wird. – Onei

1

Verwenden Jquery $.each() über das Array iterieren anstelle einer for-Schleife.

Zum Beispiel:

$.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); 
    }); 
});