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

React Native API请求首次调用无返回,二次调用才返回问题求助

解决React Native API首次调用无数据返回问题

一、排查并修复URL格式问题

你的API URL模板字符串中存在换行和多余空格,这会导致实际请求的URL带有无效空格字符(?后有两个空格),服务器可能无法正确解析参数,进而返回异常结果。

修改searchDeputy函数中的API URL,去除换行和多余空格:

import axios from "axios";

export const searchDeputy = async (stateValue, politicalPartyValue) => {
  if (stateValue === "TODOS" || stateValue === "Estado") {
    stateValue = "";
  }

  if (politicalPartyValue === "TODOS" || politicalPartyValue === "Partido") {
    politicalPartyValue = "";
  }

  // 修复URL:去掉换行和多余空格
  const apiUrl = `https://dadosabertos.camara.leg.br/api/v2/deputados?siglaUf=AM&siglaPartido=&ordem=ASC&ordenarPor=nome`;

  console.log(apiUrl);

  try {
    const response = await axios.get(apiUrl, {
      headers: {
        Accept: "application/json",
      },
    });

    // response.data.dados是同步数据,无需额外await
    const searchDeputyData = response.data.dados;
    return searchDeputyData;
  } catch (error) {
    console.error("Error fetching data:", error);
    return null;
  }
};

二、修正状态更新后的日志逻辑

React的状态更新是异步的,你在setSearchDeputyData(response)后立刻console.log(searchDeputyData),打印的是更新前的旧状态,这会让你误以为数据没返回。

方式1:直接打印返回的响应数据

<View className="p-2">
  <Pressable
    onPress={async () => {
      const response = await searchDeputy(stateValue, politicalPartyValue);
      setSearchDeputyData(response);
      // 打印实际返回的响应数据
      console.log("Fetched data:", response);
    }}
  >
    <FontAwesome name="search" size={34} color="black" />
  </Pressable>
</View>

方式2:用useEffect监听状态变化

在组件中添加:

useEffect(() => {
  console.log("Updated state data:", searchDeputyData);
}, [searchDeputyData]);

三、实现自动重试机制(备用方案)

如果修复URL和日志后仍存在偶尔首次请求失败的情况,可以在searchDeputy函数中添加重试逻辑,当首次请求返回null或空数据时自动重试一次:

import axios from "axios";

export const searchDeputy = async (stateValue, politicalPartyValue, retryCount = 0) => {
  if (stateValue === "TODOS" || stateValue === "Estado") {
    stateValue = "";
  }

  if (politicalPartyValue === "TODOS" || politicalPartyValue === "Partido") {
    politicalPartyValue = "";
  }

  const apiUrl = `https://dadosabertos.camara.leg.br/api/v2/deputados?siglaUf=AM&siglaPartido=&ordem=ASC&ordenarPor=nome`;

  console.log(`Attempt ${retryCount + 1}:`, apiUrl);

  try {
    const response = await axios.get(apiUrl, {
      headers: {
        Accept: "application/json",
      },
    });

    const searchDeputyData = response.data.dados;
    // 数据为空且未重试过,触发重试
    if (!searchDeputyData && retryCount < 1) {
      console.log("No data returned, retrying...");
      return searchDeputy(stateValue, politicalPartyValue, retryCount + 1);
    }
    return searchDeputyData;
  } catch (error) {
    console.error(`Error in attempt ${retryCount + 1}:`, error);
    // 请求失败且未重试过,触发重试
    if (retryCount < 1) {
      console.log("Request failed, retrying...");
      return searchDeputy(stateValue, politicalPartyValue, retryCount + 1);
    }
    return null;
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:50:10