-->

$的getJSON和循环问题($getJSON and for loop issue)

2019-07-21 08:24发布

这是为了填充表与从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 ivar array回来一点帮助。 我用JavaScript相对缺乏经验所以想也许一个变量不能在循环内使用两次? 除此之外,也许是与使用循环内的ID?

Answer 1:

这是一个经典的问题: 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);
    });
}


Answer 2:

使用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);
    });
});


Answer 3:

的getJSON是一个异步 AJAX调用

REFER: 使用同步Ajax调用



Answer 4:

你应该写这样一个功能 -

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

每次调用一些延迟将在这里需要。



文章来源: $getJSON and for loop issue