2013-03-11 131 views
8

這是用MediaWiki API查詢返回的結果數量填充表格/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參數到一個數組,用於一個循環,以縮短整體的代碼。

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

第一個unlooped版本的作品。但是當我添加一個循環時,它沒有。 $getJSON部分執行,但它然後無法將結果數據添加到id。我通過JSLint運行它,除了抱怨循環中的函數,並且宣佈var ivar array沒有什麼幫助。我對JavaScript相對缺乏經驗,所以也許一個變量不能在循環中使用兩次?除此之外,也許有關在循環中使用ID的事情?

+0

[使用setTimeout和在for循環中的整數](可能重複http://stackoverflow.com/questions/13731759/using-settimeout-and-an-integer- for循環) – 2013-03-11 20:20:42

+0

[Javascript閉包內循環 - 簡單實用示例]的可能重複(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Bergi 2013-03-11 20:21:13

+0

getJSON是異步調用 REFER:[使用同步ajax調用] [1] [1]:http://stackoverflow.com/questions/3419026/jquery-getjson-function-timing-issue – Girish 2013-03-11 20:34:33

回答

23

這是一個經典問題:當調用回調時,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); 
} 
+1

謝謝,它修復了它 – Onei 2013-03-11 20:22:56

+1

哇!你太棒了,但JavaScript ...我真的更喜歡Java的'final'機制,對我來說更直觀 – 2013-12-25 21:06:09

+0

@dystroy對不起,現在接受:) – Onei 2014-09-19 07:31:17

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

ie

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

這裏需要對每個呼叫進行一些延遲。

1

的getJSON爲異步 AJAX調用

REFER:use synchronous ajax calls

+0

我確實在探索同步ajax調用,但有人指出,每次調用只有在前一個調用完成後才執行,每次調用需要0.5到1秒之間的時間。看到腳本中有8個調用,這使我可能需要8秒才能加載腳本。人們會懷疑它是否會加載。 – Onei 2013-03-12 11:11:41

1

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