[英]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循環中的第一個getUserData
從i = 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#map
, Array#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.