$ getJSON和for循环问题

时间:2013-03-11 20:15:14

标签: 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);
});

但是,由于它重复了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 个答案:

答案 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调用

参考:use synchronous ajax calls

答案 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);
}

此处需要延迟每次通话。