我觉得我在这里挖掘自己。我有一系列艺术家的名字,并使用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
});