$ getJSON和for循环问题

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