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

JavaScript项目点击两次搜索按钮才显示OMDb电影信息问题求助

问题解决:OMDb搜索点击一次显示空div,需两次才正常的问题

问题核心

问题出在异步操作的执行顺序错误。ApiModule.searchByTitle() 是向OMDb发送网络请求的异步操作,不会立刻返回数据,但你调用它之后马上就去获取电影信息、创建卡片,此时请求还未完成,ApiModule里的电影数据还是空的,所以第一次生成的卡片没有内容。第二次点击时,第一次的请求已经完成,数据被存入ApiModule,因此能正常显示。

解决方案

必须等异步请求完成后,再去获取数据并创建卡片,以下是两种可行的修改方式:

方式1:使用Async/Await(代码更清晰)

修改 searchOnClick 为异步函数,等待请求完成后再执行后续逻辑:

async function searchOnClick(input) {
  // 等待异步请求完成
  await ApiModule.searchByTitle(input.value);
  
  const container = document.querySelector('.movie-list-container');
  const title = ApiModule.getMovieTitle();
  const year = ApiModule.getMovieYear();
  const rated = ApiModule.getMovieRated();
  const plot = ApiModule.getMoviePlot();
  const count = CountModule.getItemCount();
  
  container.appendChild(createItemCardTest(title, year, rated, plot, count));
  CountModule.addItem();
}

同时要确保 ApiModule.searchByTitle 返回Promise,示例实现如下:

// ApiModule内部的searchByTitle函数示例
async function searchByTitle(title) {
  const apiKey = '你的OMDb API密钥';
  const response = await fetch(`https://www.omdbapi.com/?t=${encodeURIComponent(title)}&apikey=${apiKey}`);
  const data = await response.json();
  
  // 将返回数据存入模块内部变量,供get方法读取
  this.movieData = data;
}

方式2:使用回调函数

如果不想用async/await,可以给 searchByTitle 添加回调参数,请求完成后再执行卡片创建逻辑:

// 修改ApiModule的searchByTitle,增加回调参数
function searchByTitle(title, callback) {
  const apiKey = '你的OMDb API密钥';
  fetch(`https://www.omdbapi.com/?t=${encodeURIComponent(title)}&apikey=${apiKey}`)
    .then(response => response.json())
    .then(data => {
      this.movieData = data;
      // 请求完成后触发回调
      callback();
    });
}

// 修改searchOnClick函数
function searchOnClick(input) {
  ApiModule.searchByTitle(input.value, () => {
    // 回调内获取数据并创建卡片
    const container = document.querySelector('.movie-list-container');
    const title = ApiModule.getMovieTitle();
    const year = ApiModule.getMovieYear();
    const rated = ApiModule.getMovieRated();
    const plot = ApiModule.getMoviePlot();
    const count = CountModule.getItemCount();
    
    container.appendChild(createItemCardTest(title, year, rated, plot, count));
    CountModule.addItem();
  });
}

关键提示

异步操作(如网络请求)不会阻塞代码执行,必须确保数据返回后再进行后续的DOM渲染操作,这是解决这类问题的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:37:50