我正在尝试拉出5个单独的JSON提要并让它循环,每个人都有一个嵌套的getJSON。
var feedList [feed1,feed2,feed3,feed4,feed5];
for (feed in feedList) {
var index = 0;
$.getJSON(feedList[feed], function(data) {
$.each(data.items, function(i, obj) {
$('li').append(obj.title + '=' + index + '<br>');
});
index++;
}
}
出于某种原因,在firebug中它显示我通过for循环然后成功拉动feed然后完全绕过.getJSON循环内的任何东西。在拉出所有Feed之前,它不会返回到.getJSON循环。这会弄乱被拉物品的顺序,每次刷新页面时订单都是随机的。 (例如,首先列出feed2,然后列出feed4)
我也尝试过循环而不是for循环,但它仍然没有改变。
任何人都可以帮助我吗?
答案 0 :(得分:1)
使用递归函数
发送上一个请求成功的下一个请求function getFeed(feed){
$.getJSON(feed, function(data) {
$.each(data.items, function(i, obj) {
$('li').append(obj.title + '=' + index + '<br>');
});
if(feedList.length > index + 1)
getFeed(feedList[++index]);
}
}
// start
getFeed(feedList[0]);
答案 1 :(得分:0)
尝试使用常规循环,结合自执行匿名函数。但是,您可能需要明确禁用ajax的异步性。
for ( var i = 0, l = feedList.length; i<l; ++i ) {
(function() {
// $.getJSON code
})();
}
实际上内部功能可能毫无用处。您可以使用
禁用异步$.ajaxSetup( { "async": false } );
答案 2 :(得分:0)
顺序是随机的,因为$.getJSON
是对文件的异步请求。简而言之,每个请求都需要一些时间来完成,并且只有在每个请求分别完成时,才会为每个请求调用您的函数(使用each
调用)。
问题出现在您无法控制哪些请求将以哪种顺序返回。由于所有要求同时进行。
您可以在尝试下一个请求之前等待每个请求完成后按顺序获取Feed:
var feedList [feed1,feed2,feed3,feed4,feed5];
var index = 0;
function getFeed(index) {
$.getJSON(feedList[index], function(data) {
$.each(data.items, function(i, obj) {
$('li').append(obj.title + '=' + index + '<br>');
});
if (index < feedList.length - 1)
getFeed(++index);
});
}
getFeed(0);