将从节点promise返回的对象循环到下一个.then

Loop the object returned from node promise and feed to the next .then

本文关键字:循环 下一个 then 对象 节点 promise 返回      更新时间:2023-09-26

我已经被这个问题困住了,似乎是永恒的。我刚刚进入node,开始思考承诺等问题。

我想做的是从Spotify API获取数据,我要做的第一件事就是得到我自己的播放列表:

function getPlaylists(access_token) {
    var options = {
      url: 'https://api.spotify.com/v1/me/playlists',
      headers: { 'Authorization': 'Bearer ' + access_token },
      json: true
    };
    return new Promise(function(resolve, reject) {
      request.get(options, function(error, response, body) {
        var playlists = body.items;
        var playlistArray = [];
        playlists.forEach(function(playlist) {
          var name = playlist.name;
          var url = playlist.tracks.href;
          playlistArray.push(url);
        });
        if(!error) {
          resolve(playlistArray);
        } else {
          reject(error);
        }
    });
  });
}

好的,到目前为止一切顺利。现在我还想从这些播放列表中获取艺术家:

function getArtists(url,access_token) {
  var params = {
    url: url,
    headers: { 'Authorization': 'Bearer ' + access_token },
    json: true
  };
  return new Promise(function(resolve, reject) {
    request.get(params, function(error, response, body) {
        var tracks = body.items;
        var artistArray = [];
        tracks.forEach(function(artists) {
          let allArtists = artists.track.artists;
          allArtists.forEach(function(artist) {
              artistArray.push(artist);
          });
        })
        if(!error) {
          resolve(artistArray);
        } else {
          reject(error);
        }
    });
  })
}

我返回所有这些数据的方式是:

getPlaylists(access_token)
     .then(function(playlists) {
       playlists.forEach(function(playlist) {
          getArtists(playlist,access_token)
               .then(function(artist) {
                    return artist;
               });
     });

     }).then(function(artists) {
        console.log("getting artists",artists);
     }).catch(function(error) {
        console.log(error);
})

然而,这返回undefined。我只能使它工作,如果我在一个单一的播放列表url传递给getArtists函数-问题是forEach循环,我不知道如何处理。

任何帮助都非常感谢!

你可以使用[].map()Promise.all()的组合来做一个Promise,等待一系列动作的完成:

getPlaylists(access_token)
  .then(playlists => Promise.all(playlists.map(playlist => 
    getArtists(playlist, access_token)))
  .then(artists => {
    // use here
  });

记住,对于承诺链,你必须.then()处理程序返回一个值或承诺。.forEach()总是返回undefined,无论什么

首先,我们通过使用.map()getArtist将playlist数组转换为Promise数组,然后我们将该Promise数组传递给Promise.all(),它返回一个Promise,当数组中的所有Promise都解析时(或者当第一个Promise拒绝时),该Promise将解析。