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

React/JS调用双API获取电影列表,如何获取Promise中的实际数组结果

解决:获取async函数返回的实际电影数组

核心原因:所有async函数的返回值都是Promise对象,哪怕内部用了await,外部调用时必须处理这个Promise才能拿到实际结果。

一、React组件中的正确写法(推荐)

在React组件里,不能直接在顶层使用await,需要结合useState(存储数据)和useEffect(执行异步操作):

import { useState, useEffect } from 'react';
import { fetchMovies } from './你的文件路径';

function MovieList() {
  // 用状态存储电影数组
  const [movies, setMovies] = useState([]);
  // 加载状态,避免渲染空数据
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    // 在useEffect内部定义async函数
    const loadMovieData = async () => {
      // 用await获取fetchMovies返回的实际数组
      const movieArray = await fetchMovies();
      setMovies(movieArray);
      setIsLoading(false);
    };

    loadMovieData();
  }, []); // 空依赖数组确保组件挂载时只执行一次

  if (isLoading) {
    return <div>加载电影中...</div>;
  }

  return (
    <div className="movie-list">
      {/* 遍历渲染电影数据 */}
      {movies.map(movie => (
        <div key={movie.imdbID} className="movie-item">
          <h3>{movie.Title}</h3>
          <p>年份:{movie.Year}</p>
        </div>
      ))}
    </div>
  );
}

export default MovieList;

二、理解为什么原代码拿不到数组

你主组件中的const movies = getMovies();,因为getMovies是async函数,所以movies本质是一个Promise对象,而非实际的电影数组。要拿到内部结果,要么用await(必须在async函数内),要么用.then():

// 用.then()处理Promise
getMovies().then(movieArray => {
  console.log(movieArray); // 这里拿到实际的12部电影数组
});

三、优化请求效率(可选)

你的fetchMovies当前是串行请求12次(每次等上一个请求完成再发下一个),可以改成并行请求提升速度:

const getMovie = async () => {
  const omdpURL = "http://www.omdbapi.com/?apikey=xxxxxx&t="; // 去掉多余的i参数,避免冲突
  const randomMovieRes = await fetch("https://k2maan-moviehut.herokuapp.com/api/random");
  const randomMovie = await randomMovieRes.json();
  const movieRes = await fetch(omdpURL.concat(randomMovie.name));
  return movieRes.json();
}

export const fetchMovies = async() => {
  // 一次性生成12个请求Promise
  const moviePromises = Array.from({ length: 12 }, () => getMovie());
  // 并行等待所有请求完成,返回结果数组
  return Promise.all(moviePromises);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:15:38