这是为了填充表与从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 i
与var array
回来一点帮助。 我用JavaScript相对缺乏经验所以想也许一个变量不能在循环内使用两次? 除此之外,也许是与使用循环内的ID?
这是一个经典的问题: 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);
});
}
使用jQuery $。每()来遍历数组,而不是一个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);
});
});
你应该写这样一个功能 -
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);
}
每次调用一些延迟将在这里需要。