【问题标题】:Adding results from multiple requests - Node JS添加来自多个请求的结果 - Node JS
【发布时间】:2020-02-16 00:03:22
【问题描述】:

我正在尝试使用 Spotify's API 获取某个用户的所有已保存曲目的列表(后记我需要从该列表中随机化 10 首歌曲,但我无法达到这一点)。

我是 Node JS 的初学者,但仍在尝试理解回调和承诺的概念。我正在尝试使用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 首曲目的列表。

我怎样才能得到一个包含我以后可以在程序中使用的所有曲目的列表?

谢谢!

【问题讨论】:

    标签: node.js express asynchronous promise axios


    【解决方案1】:

    您可以尝试使用Promise.all

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

    你在这里嵌套了 Promise,这是一种不好的做法,被称为 Promise hell

    getTracks(0, access_token).then(data => {
            const total = (data / 50) + 1;
            for (let i = 1; i <= total; i++) {
                //This is a promise hell 
               getTracks(i * 50, access_token).then(moredata => {
    
                });
            }    
        });
        res.send(tracks);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多