12

这是用从 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 ivar array我对javascript相对缺乏经验,所以认为一个变量可能不能在循环中使用两次?除此之外,也许与在循环中使用 id 有关?

4

4 回答 4

31

这是一个经典问题: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);
    });
}
于 2013-03-11T20:16:16.253 回答
3

getJSON 是一个异步ajax 调用

REFER:使用同步 ajax 调用

于 2013-03-11T20:36:36.913 回答
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);
    });
});
于 2016-01-25T18:57:43.430 回答
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);
}

每次通话都需要一些延迟。

于 2013-03-11T20:22:41.047 回答