我正在尝试使用Spotify's API来获取某个用户的所有已保存曲目的列表(后缀,我需要从该列表中随机抽取10首歌曲,但是无法达到这一点)。
我是Node JS的初学者,仍在尝试了解回调和Promise的概念。我正在尝试使用axios发出所有请求。这是我到目前为止的代码:
let tracks = []
function getTracks(offset, access) {
const auth = {
headers: { Authorization: 'Bearer ' + access }
}
return axios.get('https://api.spotify.com/v1/me/tracks?limit=50' + (offset > 0 ? '&offset=' + offset : ''), auth) // url changes based on offset value
.then(result => {
result.data.items.forEach(element => {
tracks.push({ title: element.track.name, artist: element.track.artists });
});
return result.data.total;
})
.catch(error => {
return error;
});
}
router.get('/getsongs', function (req, res) {
const access_token = req.query.access || null; // contains access token
getTracks(0, access_token).then(data => {
const total = (data / 50) + 1;
for (let i = 1; i <= total; i++) {
getTracks(i * 50, access_token).then(moredata => {
// I'm not sure what I can put in here
// I tried 'console.log('test')' and it does print a certain amount of times based on the loop
});
}
});
res.send(tracks);
});
其背后的想法是首先请求50个音轨,然后找到音轨的总数。在那之后,我将根据总数循环一定的时间,并每次设置一个偏移量以获取下50个音轨。所有曲目都添加到全局列表tracks
中,所有请求完成后,我会将其发送给客户端。
我尝试了很多的不同版本,无论我最终得到的是空白列表还是仅前50首曲目的列表。
如何最终得到一个包含所有曲目的列表,以便以后在程序中使用?
谢谢!
答案 0 :(得分:1)
您可以尝试使用Promise.all
git clean
您在此处嵌套了Promise,这是一个不好的习惯,称为Promise hell
router.get('/getsongs', function(req, res) {
let asyncTasks = [];
const access_token = req.query.access || null; // contains access token
return getTracks(0, access_token).then(data => {
const total = data / 50 + 1;
for (let i = 1; i <= total; i++) {
asyncTasks.push(getTracks(i * 50, access_token));
}
return Promise.all(asyncTasks);
})
.then(listTrack => {
console.log(listTrack)
});
});