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