React Native异步fetch请求Flask后端数据时返回值异常与日志顺序颠倒问题排查
React Native异步fetch请求Flask后端数据时返回值异常与日志顺序颠倒问题排查
兄弟,我一眼就看出你这问题完全是异步函数的调用姿势不对导致的,咱们拆成两个点来把问题讲透:
问题根源解析
1. 日志顺序颠倒的原因
get_posts是一个async异步函数,你在PostScreen里直接写var posts = get_posts();的时候,代码并不会等待这个异步请求完成,而是会先执行后面的console.log("return: ")这些代码。等后端的数据真正返回、get_posts内部的异步操作完成后,才会执行函数里的console.log(obj),所以日志顺序就完全反过来了。
2. 返回值是{"_h": 0, "_i": 0, "_j": null, "_k": null}的原因
这个奇怪的对象其实是未完成状态的Promise内部结构!因为所有async函数默认都会返回一个Promise对象,你直接赋值var posts = get_posts();拿到的并不是最终的后端数据,而是一个还没被resolve的Promise,那个对象就是Promise的内部状态标识。
正确的解决方案
你的Request.js里的get_posts函数其实写得没问题,不用改!只需要修改App.js里PostScreen的调用方式就行,核心是用await等待异步函数完成,并且把请求逻辑放在React的副作用钩子useEffect里(组件主函数不能直接是async,这是React的规则)。
修改后的PostScreen代码如下:
const PostScreen = () => { const navigation = useNavigation(); const [tags, setTags] = useState([]); const [text, setText] = useState(''); const [posts, setPosts] = useState(null); // 新增状态来保存请求到的posts // 用useEffect在组件挂载时发起异步请求 useEffect(() => { // 定义内部的异步函数,这样就能用await了 const fetchPosts = async () => { try { // 这里加await,才能拿到真正的后端返回数据 const fetchedPosts = await get_posts(); console.log("returned posts: "); console.log(fetchedPosts); // 用setPosts更新状态,触发组件重新渲染展示数据 setPosts(fetchedPosts); // 你可以在这里根据需要处理数据,比如更新tags状态 // setTags(...) } catch (error) { // 一定要加错误捕获,处理网络失败、后端报错等情况 console.error("请求数据时出错了: ", error); } }; fetchPosts(); }, []); // 空依赖数组表示这个副作用只在组件第一次挂载时执行一次 // 数据还没返回时,显示加载提示 if (!posts) { return <Text>加载中...</Text>; } // 数据返回后,正常渲染页面内容 return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>获取到的帖子数据:</Text> <Text>{JSON.stringify(posts)}</Text> </View> ); };
关键注意事项
async/await必须配对使用:只要调用async函数,想要拿到它的返回值,就必须加await,而且这个调用必须在另一个async函数内部(或者用.then()链式调用,不过await可读性更高)。- React组件里的异步逻辑要放
useEffect:组件的主渲染函数不能是async,所以异步请求、定时器这类副作用,都要放在useEffect或者事件处理函数(比如按钮的onPress)里。 - 用状态管理异步数据:直接用变量赋值
var posts = ...不会触发组件重新渲染,必须用useState保存数据,更新状态时React才会重新渲染页面展示最新数据。 - 一定要加错误捕获:网络请求很容易失败(比如后端挂了、网络断了),用
try/catch包裹异步逻辑,能避免程序崩溃,还能在控制台看到具体错误信息。
备注:内容来源于stack exchange,提问作者Nicolas de CLEMECIN
相关产品推荐
相关产品推荐

