.getJSON在for循环中无法正常工作

时间:2014-07-05 21:01:45

标签: jquery json for-loop asynchronous

初学者。

我有以下代码

$.getJSON('http://uifaces.com/api/v1/random', function(uifaces){
                    var name=uifaces.username;
                    document.write(name)});  

它运行正常但是当我把它放在for循环中时,它应该在每次迭代时检索一个不同的名称,但每次都输出相同的名称。

我做了一些研究,我遇到了两个建议。一个涉及闭包,另一个涉及队列。但这不是:

for ( var i = 0; i < 5; i++ ) {
(function(i){
$myQueue.queue(function(next){
            $.getJSON('http://uifaces.com/api/v1/random', function(uifaces){
                    var name=uifaces.username;
                    document.write(name)});           
        next();
    });
})(i);
}
$myQueue.dequeue();

这也不行。他们只输出相同的名称。

for(var i=0; i<5; i++){
(function(i){
$.getJSON('http://uifaces.com/api/v1/random', function(uifaces){
    var name=uifaces.username;
    document.write(name)
    }
    });
})(i);

}

我无法找到有关如何解决此问题的任何其他建议。任何建议都会有很大帮助。

2 个答案:

答案 0 :(得分:2)

AJAX请求默认缓存在jQuery中(脚本和jsonp请求除外)。当您反复请求相同的资源时,它只会获取一次,然后在其他时间提供缓存的结果。这就是为什么你一遍又一遍地得到相同的结果。

使用ajax方法,以便您可以指定缓存应该关闭:

for(var i=0; i<5; i++){

  $.ajax({
    url: 'http://uifaces.com/api/v1/random',
    type: 'GET',
    dataType: 'json',
    cache: false,
    success: function(uifaces){
      var name = uifaces.username;
      document.write(name);
    }
  });

}

注意:我只留下document.write用于测试目的,因为它似乎适合您当前的情况。通常你不能像这样可靠地使用document.write;在完成加载后写入文档将打开一个替换当前文档的新文档。

答案 1 :(得分:0)

这是一个同步问题。不要使用getJSON,而是使用getJSON所基于的$.ajax function。然后,您可以指定“async:false”参数,该参数将等待服务器为循环的每次迭代返回正确的名称值。