You need to enable JavaScript to run this app. 调用Swapi API展示角色参演电影返回[object Promise]问题求解
优惠活动
大模型
产品
解决方案
定价
更多

调用Swapi API展示角色参演电影返回[object Promise]问题求解

问题根源

  • 所有标注async的函数默认返回Promise对象,你在同步执行的people函数里直接调用get_movies,拿到的是未完成的Promise实例,转换为文本后就是[object Promise]
  • get_movies内部遍历电影链接发起的axios请求都是异步任务,没有做批量等待处理,就算等get_movies执行完也拿不到所有电影名称结果

修复后的完整代码

const fetch_data = async () => {
  try {
    const res = await axios.get("https://swapi.dev/api/people");
    // 等待所有角色的电影请求完成后再渲染
    await people(res.data.results);
  } catch (err) {
    console.log("请求数据出错", err);
  }
};

let people = async (data) => {
  const mainContainer = document.getElementById("myData");
  // 遍历每个角色,异步获取对应电影名称
  for (const person of data) {
    // 先渲染角色基础信息
    const div = document.createElement("div");
    div.innerHTML = `姓名:${person.name} 头发颜色:${person.hair_color} 出生年份:${person.birth_year}`;   
    mainContainer.appendChild(div);
    
    // 等待该角色所有电影名称请求完成
    const movieTitles = await get_movies(person.films);
    const p = document.createElement('p');
    p.innerText = `参演电影:${movieTitles.join('、')}`;
    mainContainer.appendChild(p);
  }
};

// 批量获取所有电影名称
let get_movies = async (movies) => {
  // 用Promise.all等待所有电影接口请求完成
  const movieRequests = movies.map(movie => axios.get(movie));
  const movieResponses = await Promise.all(movieRequests);
  // 提取所有电影标题返回
  return movieResponses.map(res => res.data.title);
}
 
fetch_data();

关键修改点

  • 将people、get_movies函数调整为异步逻辑,所有异步请求都通过await等待执行完成后再处理返回结果,避免直接拿到Promise对象
  • 用Promise.all批量等待单个角色关联的所有电影接口请求,全部请求完成后统一提取电影标题返回
  • 调整渲染顺序:先渲染角色基础信息,等电影名称全部获取完毕后再插入对应的文本节点到页面,不会出现Promise占位的异常文本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 19:06:03