React/React Native调用getUser接口返回Promise无法获取数据问题
问题原因
两个核心问题导致拿不到接口数据:
getUser函数写法错误:你在函数内用await等待了fetch请求链,但没有把请求最终的结果return出去,函数执行完没有有效返回值,返回的Promise最终resolve值为undefined。- 调用方式错误:所有标记了
async的函数,调用后会立刻返回一个处于pending状态的Promise对象,你直接打印getUser()的调用结果,没有等待Promise完成,自然拿不到实际的接口返回数据。
另外你贴的User组件代码里漏了useEffect的导入,运行时会直接报错。
修复方案
第一步:修正getUser.js的请求逻辑
getUser.js是纯请求工具函数,不需要导入React,你代码里的import React from "react"可以直接删除。
两种正确请求写法二选一即可,不要混用async/await和.then链造成逻辑混乱:
// 写法1:直接返回Promise链,不需要额外套async export const getUser = () => { return fetch("https://myapi.com") .then((response) => { // 加上请求状态判断,避免4xx/5xx错误没被捕获 if (!response.ok) throw new Error(`请求错误:${response.status}`) return response.json() }) };
// 写法2:纯async/await写法,记得return最终结果 export const getUser = async () => { const response = await fetch("https://myapi.com") if (!response.ok) throw new Error(`请求错误:${response.status}`) return response.json() };
第二步:修正组件内的调用逻辑
调用getUser时必须加await等待请求完成,同时建议把接口数据存入组件state用于渲染,加上加载态和错误捕获:
// 补全useEffect的导入 import React, { useState, useEffect } from 'react' import { getUser } from './someplace/getUser' export default function User() { const [userData, setUserData] = useState(null) const [loading, setLoading] = useState(false) const [errMsg, setErrMsg] = useState('') useEffect(()=>{ getDataFromUser() },[]) const getDataFromUser = async() => { setLoading(true) try { // 等待getUser请求完成,拿到实际返回数据 const res = await getUser() console.log(res) // 此处打印的就是接口返回的真实数据 setUserData(res) } catch (err) { setErrMsg(err.message) } finally { setLoading(false) } } // 渲染时处理加载、错误状态 if (loading) return <div>数据加载中...</div> if (errMsg) return <div>加载失败:{errMsg}</div> if (!userData) return null return ( <div className="user-container"> {/* 在这里基于userData渲染内容即可 */} </div> ) }
OtherUser.js的调用逻辑和上述代码完全一致。如果不想两个组件重复发起相同请求,可以选择在共同父组件请求后通过props下发数据,或者接入全局状态管理(React Context、Redux、Zustand等)统一存储用户数据,一次请求供所有组件使用。
内容的提问来源于stack exchange,提问作者Haksatrya Bhaswara
相关产品推荐
相关产品推荐

