【发布时间】:2013-06-26 14:59:24
【问题描述】:
我正在使用 facebooks javascript API 从 Facebook 页面导入 albums 和 photos。
首先,我通过 API 调用导入 albums。
然后我通过另一个 API 调用将每个 album 的 photos 导入到数组中。
最后一步 - 通过另一个 API 调用,我导入了每张专辑的 coverPhotos,这样我就可以用所有的 albums 和它们的 coverPhotos 创建一个 jquery mobile listView。
我的代码如下所示:
<script>
var albumPhotos = new Array();
var albumThumbnails = new Array();
window.fbAsyncInit = function() {
// init the FB JS SDK
FB.init({
appId : '564984346887426', // App ID from the app dashboard
channelUrl : 'channel.html', // Channel file for x-domain comms
status : true, // Check Facebook Login status
xfbml : true // Look for social plugins on the page
});
// Additional initialization code such as adding Event Listeners goes here
FB.api('169070991963/albums', function(response) {
if(!response || response.error) {
// render error
alert("Noo!!");
} else {
// render photos
for(var i=0; i<response.data.length; i++) {
(function (i) {
var albumName = response.data[i].name;
var albumCover = response.data[i].cover_photo;
var albumId = response.data[i].id;
var numberOfPhotos = response.data[i].count;
FB.api(albumId + "/photos", function(response) {
if(!response || response.error) {
// render error
alert("Noo!!");
} else {
for(var k=0; k<response.data.length; k++) {
albumThumbnails[i] = albumThumbnails[i]||[];
albumThumbnails[i][k] = response.data[k].picture;
albumPhotos[i] = albumPhotos[i]||[];
albumPhotos[i][k] = response.data[k].source;
}
}
});
console.log(albumName);
FB.api( albumCover, function(response) {
if(!response || response.error) {
// render error
alert("Noo!!");
} else {
// render photos
$(".albums").append(
'<li>'+
'<a href="#Gallery' + i + '"' + 'data-transition="slidedown">'+
'<img src= "' + response.picture + '" />'+
'<h2>' + albumName + '</h2>'+
'<p>' + "Number of Photos: " + numberOfPhotos +'</p>'+
'</a>'+
'</li>')
.listview('refresh');
$("#home").after('<div data-role="page" data-add-back-btn="true" id=Gallery'+ i +
' class="gallery-page"> ' +
' <div data-role="header"><h1>Gallery</h1></div> ' + ' <div data-role="content"> ' +
' <ul class="gallery"></ul> ' + ' </div> ' +
' </div> ');
for(var x=0; x < albumPhotos[i].length; x++)
$('#Gallery' + i + ' .gallery').append('<li><a href="' + albumPhotos[i][x] + '" rel="external"><img src="' + albumThumbnails[i][x] + '" /></a></li>');
}
});
})(i);
} //end of for loop
}
});
};
这段代码有问题:
for(var x=0; x < albumPhotos[i].length; x++)
$('#Gallery' + i + ' .gallery').append('<li><a href="' + albumPhotos[i][x] + '" rel="external"><img src="' + albumThumbnails[i][x] + '" /></a></li>');
更具体地说:albumPhotos[i].length
因为对 API 的调用是异步的,所以之前实际创建数组 albumPhotos 的 API 调用尚未完成,这意味着该数组尚未定义。
在调用最后一个 API 调用FB.api(albumCover, function(response) {..}之前我需要一个方法
确保之前的 API 调用:
FB.api(albumId + "/photos", function(response) {
if(!response || response.error) {
// render error
alert("Noo!!");
} else {
for(var k=0; k<response.data.length; k++) {
albumThumbnails[i] = albumThumbnails[i]||[];
albumThumbnails[i][k] = response.data[k].picture;
albumPhotos[i] = albumPhotos[i]||[];
albumPhotos[i][k] = response.data[k].source;
}
}
});
已经结束了。
在此处执行此类操作的最简单方法是什么?
【问题讨论】:
-
Promises 将是一个很好的解决方案。如果您不介意使用库,请查看 when.js:github.com/cujojs/when(例如)。
-
它是一个 jquery 移动网站。这个 javascript 可以在所有移动浏览器中执行吗?另外,如果您对此有一些经验,您能否回答我如何在我的代码中使用它?非常感谢。
-
如果你仍然使用 jQuery,你可以使用 jQuery 的 deferred/promise 实现。请参阅api.jquery.com/category/deferred-object 和api.jquery.com/deferred.then(最后一个示例,链任务)。您会在 SO 上找到很多关于此的问题,例如stackoverflow.com/q/8049041/218196.
标签: javascript api asynchronous