Javascript 如何使2个异步API调用相继执行
我正在使用Javascript 如何使2个异步API调用相继执行,javascript,api,asynchronous,Javascript,Api,Asynchronous,我正在使用facebooksjavascript-API从Facebook页面导入相册和照片 首先,我使用API调用导入相册 然后,我使用另一个API调用将每个相册的照片导入到数组中 最后一步-通过另一个API调用,我导入每个相册的coverPhotos,这样我就可以用所有相册及其coverPhotos创建一个jquery移动列表视图 我的代码如下所示: <script> var albumPhotos = new Array(); var albumThumbnai
facebooksjavascript-API
从Facebook页面导入相册
和照片
首先,我使用API调用导入相册
然后,我使用另一个API调用将每个相册的照片
导入到数组中
最后一步-通过另一个API调用,我导入每个相册的coverPhotos
,这样我就可以用所有相册及其coverPhotos
创建一个jquery移动列表视图
我的代码如下所示:
<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
}
});
};
function DoWork(response) {
// usefulwork...
}
已经完成了
在这里,最简单的方法是什么?简短的回答,你需要使所有依赖于正在填充的相册的代码在它们填充后工作。这意味着复制和粘贴一些代码
长长的回答
首先,让我们重构一下。为了你的理智,你需要这个函数
// checkForErrorFirst wraps your function around the error checking code first
// if there is no response, then your code will not be called
// this allows you to just write the juicy working code
// and not worry about error checking
function checkForErrorFirst(myFunc) {
return function(response) {
if (!response || response.error) {
alert("Noo!!");
} else {
myFunc(response);
}
};
}
这样你就可以做这样的事情:
<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
}
});
};
function DoWork(response) {
// usefulwork...
}
FB的电话看起来像
FB.api('169070991963/albums', checkForErrorFirst(DoWork));
既然我们已经解决了这个问题,我们需要将您的每个呼叫链接在一起,因为它们相互依赖。我像你一样在全球空间设置相册照片和相册缩略图
var albumPhotos = new Array();
var albumThumbnails = new Array();
function getAlbums(response) {
for (var i=0; i < response.data.length; ++i) {
processAlbum(response.data[i], i);
}
}
function processAlbum(album, i) {
FB.api(album.id + "/photos", checkForErrorFirst(populateAlbum(album, i)));
}
function populateAlbum(album, i) {
return function(response) {
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;
}
// now that we've populated the album thumbnails and photos, we can render the album
FB.api(album.cover_photo, checkForErrorFirst(renderAlbum(album, i)));
};
}
function renderAlbum(album, i) {
return function(response) {
var albumName = album.name;
var albumCover = album.cover_photo;
var albumId = album.id;
var numberOfPhotos = album.count;
// 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>');
};
}
// start the entire process
FB.api('169070991963/albums', checkForErrorFirst(getAlbums));
var albumPhotos=新数组();
var albumThumbnails=新数组();
函数getAlbums(响应){
对于(变量i=0;i”+
''+
“”)。列表视图(“刷新”);
美元(“#家”)。之后(“”+
“画廊”+“+
“
”+”+
' ');
对于(var x=0;x<1[i]。长度;x++)
$(“#Gallery'+i+'.Gallery')。追加(“”);
};
}
//开始整个过程
FB.api('169070991963/相册',checkForErrorFirst(getAlbums));
显然,我还没有测试过这一点,但我认为这将有助于你的理智一点 这将是一个很好的解决方案。看看when.js:(例如)如果你不介意使用一个库,它是一个jquery移动网站。这个javascript可以在所有移动浏览器中执行吗?另外,如果你有一些经验,你能给我一个关于如何在我的代码中使用它的答案吗?非常感谢。如果您仍然使用jQuery,那么您可以使用jQuery的延迟/承诺实现。请参见和(最后一个示例,链任务)。你会在这里发现很多关于这个的问题,例如,这真是一个难以置信的答案。通过几行变化,这就像一个魅力。嗯,我真的非常感谢你,安迪不需要图书馆,也不需要太复杂的东西。简单优雅的解决方案。真是太棒了。我越是反复阅读你的代码,我就越欣赏它的复杂性。出于好奇,你以前做过这件事吗,或者你只是把这件事记下来了?与此相比,我所做的实在是太难看了(不过我对js完全陌生)!既然你是唯一能帮我的人,我还有一个问题要问你。你能检查一下这个吗:我现在正在寻找的是如何知道API调用何时完成,html页面何时被动态创建。我想在调用API之前放置一个加载小部件(我会这样做),然后在导入相册后立即停止加载小部件。但是我该怎么检查呢?