Добавление результатов из нескольких запросов - Узел JS - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь использовать API Spotify , чтобы получить список всех сохраненных треков определенного пользователя (после слов мне нужно рандомизировать 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 треков.

Как мне получить один список, содержащий все дорожки, которые я могу использовать позже в программе?

Спасибо!

1 Ответ

1 голос
/ 21 октября 2019

Вы можете попробовать использовать 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);
...