0

我正在尝试使用以下 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 调用可能是异步的。在它完成专辑迭代之前,它会转到最后一个元素。如何更正代码?

4

1 回答 1

1

您的问题与 Javascript 闭包有关。

最里面的函数被触发 N 次,但调用在GetAlbums完成后执行,并且album变量等于最后一张专辑,在 N 次执行中的每一次。

一个快速的解决方法是移动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]);
        }
    });
};

to 的参数getAlbum现在可用于内部函数,并且不会改变。

于 2012-04-12T07:17:29.563 回答