getAlbumData返回空数组求助:Spotify API轨道数据批量处理问题
问题原因
你这个问题出在异步操作的时机不对:getAlbumData里用forEach遍历轨道时,每个getTrackData都是异步的Promise操作,但forEach不会等待这些Promise执行完成,循环刚跑完就直接return info了,这时候所有异步请求还没返回结果,info自然是空数组。
解决方案
改用Promise.all来处理所有异步请求,它会等待所有Promise都完成后再返回结果,这样就能正确收集到所有轨道的数据了。修正后的代码如下:
export const getTrackData = (token, key) => { return getAudioFeaturesTrack(token, key).then((response) => { return [ { "x": response.valence * 100, "y": response.energy * 100 } ]; }); } export const getAlbumData = (token, key) => { return getAlbumsTracks(token, key).then((albumResponse) => { // 收集所有getTrackData的Promise const trackPromises = albumResponse.items.map(track => { return getTrackData(token, track.id); }); // 等待所有Promise完成,再合并结果 return Promise.all(trackPromises).then(results => { // 把所有子数组合并成一个大数组 return results.flat(); }); }); }
补充说明
- 用
map代替forEach:map会返回一个包含所有Promise的数组,正好适配Promise.all的处理逻辑。 Promise.all的作用:接收一个Promise数组,会等所有Promise都执行完成后,返回一个包含所有请求结果的数组。flat()的作用:因为每个getTrackData返回的是一个数组,results会是"数组的数组",用flat()可以把它合并成一维数组,和你原本用concat的效果完全一致。
内容的提问来源于stack exchange,提问作者wcii
相关产品推荐
相关产品推荐

