【发布时间】:2011-11-17 21:37:03
【问题描述】:
我正在尝试获取我的 Facebook 照片的所有 URL。 我首先使用专辑 ID 加载“专辑”数组。 然后我遍历相册并使用照片 URL 加载“图片”数组。 (我在 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 诞生以来,每天都以一种或另一种形式一次又一次地提出这个问题。排序的答案是你不能/不应该
return来自外部函数的任何东西。如果您有更多依赖于pictures的代码,请在FB.api回调中使用回调。 -
我需要返回一个数组,其中包含所有相册中的所有照片。我将如何在第二个嵌套 FB.api 调用中的回调中执行此操作?我必须等到整个“图片”数组都填满后才能返回。
-
@JMan 您没有在回调中返回值,因为没有人可以将其返回(请记住,对 getMyPhotos 的调用已经退出)。您使用回调通知任何对“嘿,这是您请求的数据”感兴趣的人
-
就像我说的:你不能
returnpictures数组。如果有代码依赖于它被填充,它需要在@987654327中执行@回调。
标签: javascript ajax scope closures