创建一个存储一系列已解决承诺的变量



我觉得我在这里挖掘自己。我有一系列艺术家的名字,并使用Spotify的API,我想抓住每个艺术家的顶部曲目,然后将其传递到我的视图页面。因此,有了Spotify的API,我可以搜索一个艺术家的名字,但是为了抓住他们的每个顶级曲目,我也需要他们的ID。我写了这篇文章:

      PromiseArr = [];
      // Search with Spotify's API for each artist from the list of concerts retrieved
      for (var i = 0; i < concerts.length; i++) {
     // Create an array of unresloved promises and resolve all of them afterwards with Promise.all 
        PromiseArr.push(spotifyApi.searchArtists(concerts[i].performance[0].displayName));
      }
      let artists = [];
      artists = new Promise((resolve, reject) => {
        Promise.all(PromiseArr)
          .then(values => {
            // Retrieve the Artist ID in order to make calls for specific track's
            const artistIds = values.map(element => {
              if (element.body.artists.items[0]) {
                return element.body.artists.items[0].id;
              }
            });
            resolve(artistIds);
          })
          .catch(err => reject(err));
      });
      artists.then(value => res.json(value.filter(element => element != null)));

所以这给了我所有艺术家代码的数组:

[
  "391oLRVmoTkumiN79HkTWu",
  "066X20Nz7iquqkkCW6Jxy6",
  "3ur7kjN4pd94zjUxrFSMDj",
  "26AHtbjWKiwYzsoGoUZq53",
  "3P33qFNGBVXl86yQYWspFj",
  "3bFSIkxpW9NvKT1wzo9tgx",
  "4MOSNls51nJPFORKok60vV",
  "50JJSqHUf2RQ9xsHs0KMHg",
  "6reL7Hq6obyCxSqurc8i1D",
  "0I7U5I66P88nCaVVPkIz6x",
]

从那里,我能够循环循环,并进行API调用,以检索每个艺术家的顶级曲目。但是,我觉得我在做的事情非常多余。而且我似乎无法将艺术家的ID存储到一个变量中,并通过这些循环。即

const IDs = artists.then(value => res.json(value.filter(element => element != null)));

IDs将是空的。我该如何处理这个?

您可以使用Array.map将艺术家代码数组转换为一系列承诺。然后使用 Promise.all检测数组中的所有承诺何时实现。

例如。

获取一系列艺术家代码:

var array = [
  "391oLRVmoTkumiN79HkTWu",
  "066X20Nz7iquqkkCW6Jxy6",
  "3ur7kjN4pd94zjUxrFSMDj",
  "26AHtbjWKiwYzsoGoUZq53",
  "3P33qFNGBVXl86yQYWspFj",
  "3bFSIkxpW9NvKT1wzo9tgx",
  "4MOSNls51nJPFORKok60vV",
  "50JJSqHUf2RQ9xsHs0KMHg",
  "6reL7Hq6obyCxSqurc8i1D",
  "0I7U5I66P88nCaVVPkIz6x",
];

根据第一个数组中的代码,使用Array.map创建一个新的承诺数组(而不是字符串)。

var promiseArray = array.map(function(item) {
    return new Promise(function(resolve, reject) {
        //do API call here
        //item will be the string of the artist code
        //call the resolve function when complete with the API call
    });
});

然后,您可以使用Promise.all检测promiseArray中的所有承诺何时已解决或何时何时失败(如果发生故障)。

Promise.all(promiseArray).then(function(results) {
    //do stuff here
}).catch(function(error) {
    //handle error here
});

最新更新