$getJSON-und for-Schleife Problem
Dies ist zum füllen einer Tabelle mit der Menge der Ergebnisse, die zurückgegeben werden aus der MediaWiki API-Abfrage /api.php?action=query&list=querypage&qppage=BrokenRedirects
. Die Anzahl der Ergebnisse wird dann Hinzugefügt, um die id, z.B.:
//BrokenRedirects
$.getJSON('/api.php?action=query&list=querypage&qppage=BrokenRedirects&format=json', function (data) {
$('#BrokenRedirects').text(data.query.querypage.results.length);
});
Aber, da es wiederholt zu weitere 7 mal machte ich die Argumente für qppage in ein array und verwendet eine for-Schleife zu verkürzen gesamte code.
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);
});
}
Den ersten, unlooped, die version funktioniert. Aber wenn ich fügte hinzu, eine Schleife ist es nicht. Die $getJSON
Teil ausgeführt, doch es schlägt fehl, fügen Sie die resultierenden Daten zu der id. Ich lief es durch JSLint, die abgesehen von Klagen über Funktionen in einer Schleife und deklarieren var i
mit var array
kehrte wenig helfen. Ich bin relativ unerfahren mit javascript so dachte, vielleicht ist eine variable kann nicht verwendet werden, zweimal innerhalb einer Schleife? Andere als die, vielleicht etwas zu tun mit einer id innerhalb einer Schleife?
- mögliche Duplikate von Mit setTimeout und ein integer in einer for-Schleife
- möglich, Duplikat der Javascript-Verschluss in Schleifen - einfache praktische Beispiel
- getJSON ist ein asynchroner Aufruf VERWEISEN: [synchrone ajax-calls][1] [1]: stackoverflow.com/questions/3419026/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist ein klassisches problem :
i
hat den Wert von Ende der Schleife, wenn der callback aufgerufen wird.Kann man es wie folgt :
2018 Nachtrag:
Gibt es nun noch eine sauberere Lösung, die in heutigen Browsern: verwenden Sie
let
stattvar
:final
Mechanismus, viel intuitiver für michJquery $.jeder() Iteration über das array, anstatt eine for-Schleife.
Beispiel:
getJSON ist ein asynchrone ajax-call
FINDEN: verwenden Sie synchrone ajax-Aufrufe
Sollten Sie eine Funktion schreiben, die wie -
dann rufen Sie es mit einige timeout-option wie -
setTimeout('callUrl(+ array[i] +)',500);
innerhalb der loop -d.h.
Einiger Verzögerung für jeden Anruf werden hier benötigt.