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

将SoundCloud播放列表曲目赋值给JS变量后无法访问属性求助

问题分析与解决方案

你的问题核心在于异步操作的处理逻辑错误:SC.get()返回的是一个Promise对象,而非直接的播放列表曲目数组。你把这个Promise直接赋值给了audios变量,所以当你尝试访问audios.length或audios.id时,其实是在访问Promise对象的属性——而Promise本身并没有这些属性,自然会返回undefined。

正确的处理方式

SoundCloud的API调用是异步操作,你必须等到Promise完成(即API请求返回结果)后,才能拿到实际的曲目数据。这里有两种常用的解决方法:

方法1:在then回调内处理结果

将操作曲目数据的代码放在then回调函数中,因为只有当异步请求成功后,这个回调才会执行,此时你能拿到真实的playlist.tracks数组:

<script src="https://connect.soundcloud.com/sdk/sdk-3.3.2.js"></script>
<script>
SC.initialize({ 
  client_id: 'e0daf19e8a6cb0b30ab12bf9ea4df192' 
}); 
var i=348525692; 
var all_tracks=[]; 

// 调用播放列表API,在回调中处理返回的曲目数据
SC.get('/playlists/'+i).then(function(playlist) { 
  var audios = playlist.tracks;
  // 现在可以正常访问audios的属性了
  console.log(audios.length); // 输出播放列表的曲目数量
  console.log(audios[0].id); // 输出第一首曲目的ID
  
  // 如果需要在其他全局场景使用该数组,可赋值给全局变量
  all_tracks = audios;
}); 
</script>

方法2:使用async/await语法(更简洁)

如果你偏好同步风格的代码结构,可以用async/await包裹异步操作,但需要将代码放在一个async函数内:

<script src="https://connect.soundcloud.com/sdk/sdk-3.3.2.js"></script>
<script>
SC.initialize({ 
  client_id: 'e0daf19e8a6cb0b30ab12bf9ea4df192' 
}); 

async function fetchAndProcessTracks() {
  var i=348525692; 
  // 等待API请求完成,拿到完整的播放列表数据
  var playlist = await SC.get('/playlists/'+i);
  var audios = playlist.tracks;
  
  // 在这里处理曲目数据
  console.log(audios.length);
  console.log(audios[0].id);
}

// 调用异步函数触发流程
fetchAndProcessTracks();
</script>

原代码失效的原因

当你执行audios = SC.get('/playlists/'+i).then(...)时,SC.get()会立刻返回一个Promise对象,而非等待API请求完成后的曲目数组。此时audios存储的是Promise容器,而非你需要的实际曲目数据,所以访问audios.length等属性会得到undefined。

只有当Promise的状态变为resolved(即API请求成功返回数据)后,then回调里的代码才会执行,此时你才能拿到真实的playlist.tracks数组。

内容的提问来源于stack exchange,提问作者Prashant Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:18:11