在对 FB.api 进行异步调用时保留变量值
Keeping variable value while making async call to FB.api
我正在尝试使用以下JavaScript函数获取用户的专辑,第一次调用获取专辑列表,并且在专辑中迭代时,我得到了他们的封面图片:
function GetAlbums() {
FB.api('/me/albums', function(resp) {
var ul = document.getElementById('albums');
for (var i=0, l=resp.data.length; i<l; i++) {
var album = resp.data[i];
FB.api('/'+album.cover_photo, function(resp1) {
li = document.createElement('li'),
a = document.createElement('a');
a.innerHTML = "<img src='"+resp1.picture+"'/>"+album.name;
a.href = album.link;
li.appendChild(a);
ul.appendChild(li);
});
}
});
};
我不知道为什么,但封面图片可以获取,但专辑名称总是相同的。可能内部 FB.api 调用是异步的。在完成之前,专辑迭代转到最后一个元素。如何更正代码?
你的问题与Javascript闭包有关。
最里面的函数被触发 N 次,但调用在 GetAlbums
完成后执行,并且在每次 N 次执行中,album
变量等于最后一个专辑。
一个快速的解决方法是将FB.api('/'+album.cover_photo...
移动到一个单独的函数中:
function getAlbum(album) {
FB.api('/'+album.cover_photo, function(resp1) {
li = document.createElement('li'),
a = document.createElement('a');
a.innerHTML = "<img src='"+resp1.picture+"'/>"+album.name;
a.href = album.link;
li.appendChild(a);
ul.appendChild(li);
});
}
function GetAlbums() {
FB.api('/me/albums', function(resp) {
var ul = document.getElementById('albums');
for (var i=0, l=resp.data.length; i<l; i++) {
getAlbum(resp.data[i]);
}
});
};
要getAlbum
的参数现在可用于内部函数,并且不会更改。
相关文章:
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 自调用函数不保留私有值
- 使用promise.then时,是否可以保留在单击事件调用堆栈中
- 保留 Azure 移动服务的自定义 API 调用的用户身份验证
- 为什么如果失败,我无法保留调用 api
- 包装“控制台.log”并保留调用堆栈
- 如何在回发上保留选定的选项卡或以编程方式调用之前激活方法
- 在对 FB.api 进行异步调用时保留变量值
- 使用javaScriptSupport.addInitializerCall调用fnStandingRedraw以保留D
- 在保留状态的同时调用原型方法
- 如何在ajax调用后保留toggleClass事件状态
- 如何在Spring MVC中使用AJAX调用时保留搜索过滤器值
- 为什么在这种情况下调用 ES6 时“产生”是一个保留字
- 剑道UI输入焦点-在选择和Ajax调用之后,下拉列表保留焦点
- 如何在调用函数后保留标签的值
- 如何在ajax调用后保留页面的旧内容
- 如何通过各种调用保留特定的项id
- 词法作用域变量在getJSON调用中被覆盖后仍保留其值
- 对ClientScript的调用不保留网页控件中的值
- 如何编写一个能够在调用之间保留值的Javascript函数