从多个请求添加结果-Node JS

时间:2019-10-19 03:10:16

标签: node.js express asynchronous promise axios

我正在尝试使用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首曲目的列表。

如何最终得到一个包含所有曲目的列表,以便以后在程序中使用?

谢谢!

1 个答案:

答案 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)
    });
});