You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:48:22