初学者。
我有以下代码
$.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);
}
我无法找到有关如何解决此问题的任何其他建议。任何建议都会有很大帮助。
答案 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”参数,该参数将等待服务器为循环的每次迭代返回正确的名称值。