Expo React Native未处理Promise拒绝问题求助
解决React Native获取Django数据时的Promise未处理拒绝错误
核心问题:异步请求未处理异常
你的fetchData异步函数没有错误捕获逻辑,当请求失败(比如后端未启动、网络不通、接口返回非JSON格式数据)时,Promise会触发拒绝但未被处理,这就是你看到报错的直接原因。
1. 给异步请求添加错误捕获
修改HomeScreen组件里的fetchData函数,用try/catch包裹请求逻辑,捕获并处理异常:
const fetchData = async()=>{ try { const response = await fetch('http://127.0.0.1:8000/estate-list/') // 先校验请求是否成功(HTTP状态码2xx) if (!response.ok) { throw new Error(`请求失败:${response.status}`); } const data = await response.json() setData(data) } catch (error) { console.error('获取数据失败:', error); // 可选:给用户显示错误提示 // Alert.alert('加载失败', '无法获取数据,请检查网络或后端状态'); } }
2. 修复请求地址的可达性问题
- 如果你用模拟器运行Expo,
127.0.0.1指向模拟器自身,无法访问电脑上的Django后端,必须替换成你的本机局域网IP(比如http://192.168.3.10:8000/estate-list/)。 - 确保Django后端已启动,并且配置了跨域允许(可以安装
django-cors-headers库并在settings里配置)。
3. 排查其他潜在问题
- ListItem组件接收了
price属性但未在props声明,会引发控制台警告,建议补充:
const ListItem = ({ id, title, description, price }) => { const navigation = useNavigation() return ( <TouchableOpacity style={styles.card} onPress={() => navigation.navigate('Detail View', { eventId: id, title, description})}> <Text>{title}</Text> <Text>{description}</Text> <Text>价格:{price}</Text> <Button title='More Info' color={'#0f172a'} /> </TouchableOpacity> ); }
- 确认Django接口返回的是包含
id、title、description、price字段的数组,避免FlatList渲染时出现undefined报错。
完整修改后的HomeScreen代码
const HomeScreen = () => { const [data, setData] = useState([]) useEffect(() =>{ fetchData() }, []) const fetchData = async()=>{ try { // 替换为你的本机局域网IP const response = await fetch('http://192.168.x.x:8000/estate-list/') if (!response.ok) { throw new Error(`HTTP错误:${response.status}`); } const data = await response.json() setData(data) } catch (error) { console.error('加载数据失败:', error.message); } } return ( <View style={styles.screen}> <HomeList data={data} /> </View> ); }
内容的提问来源于stack exchange,提问作者Godda
相关产品推荐
相关产品推荐

