我试图抓住我的Facebook照片的所有网址。 我首先加载专辑ID的“专辑”阵列。 然后,我浏览相册并加载带有照片网址的“图片”阵列。 (我在Chrome的JS调试器中看到了这一点)。变量作用域。使用闭包?
但是,当代码到达最后一条语句(“返回图片”)时,“图片”是空的。
我该如何解决这个问题? 我觉得我应该使用闭包,但不完全确定如何最好地做到这一点。 谢谢。
function getMyPhotos() {
FB.api('/me/albums', function(response) {
var data = response.data;
var albums = [];
var link;
var pictures = [];
// get selected albums id's
$.each(data, function(key, value) {
if ((value.name == 'Wall Photos')) {
albums.push(value.id);
}
});
console.log('albums');
console.log(albums);
// get the photos from those albums
$.each(albums, function(key, value) {
FB.api('/' + value + '/photos', function(resp) {
$.each(resp.data, function(k, val) {
link = val.images[3].source;
pictures.push(link);
});
});
});
console.log('pictures');
console.log(pictures);
return pictures;
});
}
问题不是变量作用域,而是ajax调用是异步的(它们应该是)。这个问题已经以某种形式或另一次一次又一次地被询问过,自从SO开始的每一天。排序的答案是你不能从外部函数中返回任何东西。如果您有更多依赖于“图片”的代码,请在FB.api回调中使用回调。 –
我需要返回所有相册中包含所有照片的阵列。我将如何在第二个嵌套FB.api调用中的回调中执行此操作?我必须等到整个“图片”数组填满后再返回。 – JMan
@JMan你不会在回调中返回一个值,因为没有人可以返回它(记住,对getMyPhotos的调用已经退出)。你使用回调来通知谁是有意图的“嘿,这是你请求的数据” – Matt