One*_*nei 11 javascript mediawiki-api
这是使用从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);
});
Run Code Online (Sandbox Code Playgroud)
但是,由于它被重复了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);
});
}
Run Code Online (Sandbox Code Playgroud)
第一个没有环绕的版本有效.但是当我添加一个循环时它没有.该$getJSON部分执行,但然后无法将结果数据添加到id.我跑了它通过的JSLint其中除了抱怨在一个循环的功能,并宣布var i与var array返回的帮助不大.我对javascript相对缺乏经验,所以想到一个变量不能在循环中使用两次?除此之外,可能与在循环中使用id有关吗?
Den*_*ret 27
这是一个经典问题: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);
}
Run Code Online (Sandbox Code Playgroud)
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);
});
}
Run Code Online (Sandbox Code Playgroud)