Ваши вызовы 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 для следующей фотографии, пока все не будут извлечены, затем выполните ваш законченный код.