2013-03-11 21 views
8

To jest wypełnianie tabeli ilością wyników, które są zwracane z zapytania MediaWiki API /api.php?action=query&list=querypage&qppage=BrokenRedirects. Liczba wyników Następnie dodaje się identyfikator, np

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

Jednak, jak to jest powtarzany 7 razy, i kolejne się argumenty za qppage w tablicy i stosuje się do obiegu w celu skrócenia całkowitego kodu.

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

Pierwsza, rozpinana wersja działa. Ale kiedy dodałem pętlę, nie było. Część $getJSON jest wykonywana, ale następnie nie dodaje do niej wynikowych danych. Przebiegłem przez JSLint, który oprócz narzekania na funkcje w pętli i deklarowania var i z var array zwrócił małą pomoc. Jestem stosunkowo niedoświadczony w javascript, więc myślę, że być może zmienną nie można użyć dwukrotnie w pętli? Poza tym, może coś wspólnego z użyciem identyfikatora w pętli?

+0

możliwe duplikat [używa setTimeout i całkowitą w pętli] (http://stackoverflow.com/questions/13731759/using-settimeout-and-an-integer- in-a-for-loop) –

+0

możliwy duplikat [zamknięcia JavaScript wewnątrz pętli - prosty praktyczny przykład] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-praktical-example) – Bergi

+0

getJSON jest asynchroniczne wywołanie odnoszą się: [użytku synchroniczne POŁĄCZEŃ Ajax] [1] [1]: http://stackoverflow.com/questions/3419026/jquery-getjson-function-timing-issue – Girish

Odpowiedz

23

To klasyczny problem: i ma wartość końca pętli po wywołaniu wywołania zwrotnego.

Można go naprawić tak:

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

Dzięki, że naprawiono to – Onei

+1

WOW! Jesteś niesamowity, ale JavaScript ...Naprawdę wolę mechanizm 'ostateczny' Javy, o wiele bardziej intuicyjny dla mnie –

+0

@dystroy przepraszam, akceptuję teraz :) – Onei

0

Powinieneś napisać funkcję jak -

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

a następnie wywołać ją z jakąś opcją Timeout podobnego -

setTimeout('callUrl(+ array[i] +)',500); wewnątrz pętli -

tj.

W tym miejscu będzie wymagane pewne opóźnienie dla każdego połączenia.

1

getJSON jest an asynchroniczne wywołanie Ajax

odnoszą się: use synchronous ajax calls

+0

Zrobiłem przeglądanie synchronicznych wywołań ajaxowych, ale ktoś zauważył, że każde wywołanie wykonuje się dopiero po zakończeniu poprzedniego połączenia, a każde połączenie zajmuje od 0,5 do 1 sekundy. Widząc, że w skrypcie jest 8 wywołań, zajmie mi to 8 sekund, zanim skrypt się załaduje. Ludzie będą się zastanawiać, czy w ogóle to się załaduje. – Onei

1

Zastosowanie Jquery $.each() iterację tablicy zamiast pętli for.

Na przykład:

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