簡體   English   中英

如何用多個API調用填充數組?

[英]How do I fill an array with multiple api calls?

我陷入困境,試圖找出如何通過連續調用spotify api來填充“藝術家”數組。 我試圖用用戶保存的庫中的每個藝術家填充“藝術家”數組。 通話的工作方式是,每次通話最多返回50位藝術家。 但是,當我在此處填充數組,然后嘗試將新的i值傳遞給getUserData函數時,我不認為i值會更新,由於某種原因,我的“藝術家”數組最多只能填充226個,而“總計”我的測試用例的值是276。 有人可以幫我弄這個嗎? 我認為這可能是范圍問題,但我不知道在哪里。 先感謝您!

var i = 0;
function getUserData(accessToken, i) {
    return $.ajax({
        url: 'https://api.spotify.com/v1/me/tracks?limit=50&offset=' + i,
        headers: {
           'Authorization': 'Bearer ' + accessToken
        }
    });
}

 var artists = [];
 loginButton.addEventListener('click', function() {
      login(function(accessToken) {


       getUserData(accessToken, i)
            .then(function(response) {
            var total = response.total;

            while(i < total) {
            i+=50;
             getUserData(accessToken, i)
            .then(function(response) {
                total = response.total;
                alert(total); //testing
                loginButton.style.display = 'none';

for (var j = 0; j < 50 && artists.length < total; j++){                         

    artists.push(response.items[j].track.album.artists[0].name);
}
         alert(artists[7] + artists.length); //testing
         alert(artists[artists.length - 1]); //testing
            });
            }  


            });



        });
});

謝謝您的幫助!

您在while循環中的第一個getUserDatai = 50開始-因此前50個不會被壓入artists數組

for (var j = 0; j < 50 && artists.length < total; j++) {
    artists.push(response.items[j].track.album.artists[0].name);
}

在while循環之前-像這樣

var artists = [];
loginButton.addEventListener('click', function() {
    login(function(accessToken) {
        var i = 0;
        getUserData(accessToken, i)
        .then(function(response) {
            var total = response.total;
            // added code to store the first 50 artists
            for (var j = 0; j < 50 && artists.length < total; j++) {
                artists.push(response.items[j].track.album.artists[0].name);
            }
            // end added code
            while (i < total) {
                i += 50;
                getUserData(accessToken, i)
                .then(function(response) {
                    total = response.total;
                    alert(total); //testing
                    loginButton.style.display = 'none';

                    for (var j = 0; j < 50 && artists.length < total; j++) {
                        artists.push(response.items[j].track.album.artists[0].name);
                    }
                    alert(artists[7] + artists.length); //testing
                    alert(artists[artists.length - 1]); //testing
                });
            }
        });
    });
});

唯一的問題是,藝術家的順序可能是“錯誤的”,因為異步getUserData的時間可能比下一個時間長(網絡問題無法預測)

您可以重寫代碼以使用Array#mapArray#concat$.when並通過這樣做來保留數據順序

我假設response.total是軌道的總數,而不管偏移量和限制如何,因為您的代碼暗示了這一點

loginButton.addEventListener('click', function() {
    login(function(accessToken) {
        loginButton.style.display = 'none';
        var arr = [getUserData(accessToken, i)];
        arr[0]
        .then(function(response) {
            for (var i = 50; i < response.total; i += 50) {
                arr.push(getUserData(accessToken, i));
            }
            $.when.apply($, arr)
            .then(function() {
                var artists = [].concat.apply([], [].map.call(arguments, function(response) {
                    return response.items.map(function(item) {
                        return item.track.album.artists[0].name;
                    });
                }));
                // artists array is filled, now do what you need
            });
        })
        .catch(function(err) {
            // handle errors here
        });
    });
});

如上所述,但是使用本地Promise.all

loginButton.addEventListener('click', function() {
    login(function(accessToken) {
        loginButton.style.display = 'none';
        var arr = [getUserData(accessToken, i)];
        arr[0]
        .then(function(response) {
            for (var i = 50; i < response.total; i += 50) {
                arr.push(getUserData(accessToken, i));
            }
            Promise.all(arr).then(function(chunks) {
                var artists = [].concat.apply([], chunks.map(function(response) {
                    return response.items.map(function(item) {
                        return item.track.album.artists[0].name;
                    });
                }));
                // artists array is filled, now do what you need
            });
        })
        .catch(function(err) {
            // handle errors here
        });
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM