和我之前的其他人一样,我也在 Javascript 的范围内苦苦挣扎。 (那并试图阅读该死的东西)。我已经检查了关于这个问题的一些先前的线程,但我似乎无法让它们正确地应用于我的问题。
在下面的示例中,我想操纵中的值tagsArr
数组,一旦数组已完全填充。我在填充变量的函数范围之外声明了 tagArr 变量,以便全局访问它。但该变量似乎没有我期望的范围 -tagsArr.length
在第 16 行调用将其输出到控制台的位置处为 0。
$(function(){
var apiKey = [myapikey];
var tags = '';
var tagsArr = new Array();
$.getJSON('http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=' + apiKey + '&user_id=46206266@N05&extras=date_taken,tags&format=json&jsoncallback=?', function(data){
$.each(data.photos.photo, function(i, item) {
var photoID = item.id;
$.getJSON('http://api.flickr.com/services/rest/?&method=flickr.photos.getInfo&api_key=' + apiKey + '&photo_id=' + photoID + '&format=json&jsoncallback=?', function(data){
if (data.photo.tags.tag != '') {
$.each(data.photo.tags.tag, function(j, item) {
tagsArr.push(item.raw);
});
}
});
tags = tagsArr.join('<br />');
console.debug(tagsArr.length);
});
$('#total-dragged').append(data.photos.total);
$('#types-dragged').append(tags);
});
});
您对 getJSON 的调用是异步的。因此,当到达 console.debug 行时,对内部 getJSON 的所有调用仍然未完成。因此数组长度仍然为0。
最终 getJSON 调用完成后,您需要运行一些额外的代码。
$(function(){
var apiKey = [myapikey];
var tags = '';
var tagsArr = new Array();
$.getJSON('http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=' + apiKey + '&user_id=46206266@N05&extras=date_taken,tags&format=json&jsoncallback=?', function(data){
var totalExpected = data.photos.total;
var totalFetched = 0;
$.each(data.photos.photo, function(i, item) {
var photoID = item.id;
$.getJSON('http://api.flickr.com/services/rest/?&method=flickr.photos.getInfo&api_key=' + apiKey + '&photo_id=' + photoID + '&format=json&jsoncallback=?', function(data){
if (data.photo.tags.tag != '') {
$.each(data.photo.tags.tag, function(j, item) {
tagsArr.push(item.raw);
totalFetched += 1;
if (totalFetched == totalExpected)
fetchComplete();
});
}
});
function fetchComplete()
{
tags = tagsArr.join('<br />');
console.debug(tagsArr.length);
}
});
$('#total-dragged').append(data.photos.total);
$('#types-dragged').append(tags);
});
});
假设照片总数不超过默认的每页 100 张,则此操作有效,否则您需要对其进行调整。
也就是说,我认为使用 .each 来触发 getJSON 请求负载没有多大意义。我会重构它,以便任何时候只有一次对 getJSON 的调用是未完成的。让一个问题的回调用于下一张照片的下一个 getJSON,直到所有内容都被拉出,然后执行完成的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)