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

React调用OpenWeatherMap API无返回无限加载且无控制台报错问题

问题排查与解决方案

1 加载状态判断逻辑错误

你将data初始化为空对象,而JS中对象不存在length属性,data.length永远返回undefined,因此!data.length的结果恒为真,无论API是否返回数据,页面都会一直显示加载状态。

2 无请求错误捕获逻辑

当前fetch调用未配置错误捕获分支,一旦请求出现异常(如协议错误、密钥失效、跨域限制),不会在控制台抛出报错,无法感知请求失败的情况。

3 其他潜在问题

OpenWeatherMap当前已强制要求API请求使用HTTPS协议,你代码中使用的HTTP请求会被浏览器混合内容策略拦截,导致请求无返回。


修复后代码示例

import './App.css';
import React, { useState, useEffect } from 'react';

import NavBar from '../Components/NavBar/NavBar';
import CurrentData from '../Components/CurrentData/CurrentData';
import HourlyForecast from '../Components/HourlyForecast/HourlyForecast';
import Details from '../Components/Details/Details';
import DailyForecast from '../Components/DailyForecast/DailyForecast';

import 'tachyons';

const App = () => {

  const API_KEY = `my api key`;

  const [searchField, setSearchField] = useState('');
  // 单独管理加载状态,避免依赖对象属性判断出错
  const [loading, setLoading] = useState(true);
  const [data, setData] = useState({});

  useEffect(() => {
    // 请求地址改为HTTPS协议
    fetch(`https://api.openweathermap.org/data/2.5/weather?q=Cinisi&units=metric&appid=${API_KEY}`)
      .then(resp => {
        // 提前判断请求响应状态
        if(!resp.ok) throw new Error('请求异常,状态码:' + resp.status)
        return resp.json()
      })
      .then(dataRecived => {
        setData(dataRecived);
        setLoading(false);
      })
      // 新增错误捕获,控制台可直接查看异常信息
      .catch(err => {
        console.error('API调用失败:', err)
        setLoading(false)
      });
  }, []);

  // 用独立的loading状态做渲染判断
  return loading ?
    <h1>Loading...</h1> :
  (
    <React.Fragment>
    <NavBar />
    <CurrentData 
      name={data.name}
      country={data.sys.country}
      temp={data.main.temp}
      time={data.dt}
      desc={data.weather[0].description}
    />
    <HourlyForecast />
    <Details />
    <DailyForecast />
    </React.Fragment>
  );      
}

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:06:01