这是使用从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的参数变成了数组,并使用for循环来缩短整体代码。
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);
});
}
第一个未环绕的版本有效。但是当我添加一个循环时它没有。 $getJSON
部分执行,但然后无法将结果数据添加到id。我通过JSLint运行它,除了抱怨循环中的函数,并声明var i
与var array
返回一点帮助。我对javascript相对缺乏经验,所以想也许一个变量不能在循环中使用两次?除此之外,可能与在循环中使用id有关吗?
答案 0 :(得分:26)
这是一个经典问题: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);
}
2018年附录:
现在的浏览器中有另一个更清洁的解决方案:使用let
代替var
:
for (let 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);
});
}
答案 1 :(得分:3)
使用Jquery $.each()迭代数组而不是for循环。
例如:
$.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);
});
});
答案 2 :(得分:2)
getJSON是异步 ajax调用
答案 3 :(得分: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);
-
即
for (var i = 0; i < array.length; i++) {
setTimeout('callUrl(+ array[i] +)',500);
}
此处需要延迟每次通话。