Expo FileSystem.readAsStringAsync无法await?如何获取异步结果
解决Expo FileSystem读取文件时await获取返回值的问题
你现在的代码混合了async/await和.then/.catch的写法,这就是导致你拿不到正确返回值的核心原因。await本身就是用来等待Promise完成并直接获取结果的,不需要额外嵌套.then来手动赋值,咱们来调整一下代码:
修正后的getHospitals函数
getHospitals = async () => { try { // 直接await readAsStringAsync的调用,它会返回文件内容的字符串结果 const fileContent = await FileSystem.readAsStringAsync( `${FileSystem.documentDirectory}hospitals.json` ); // 因为文件是JSON格式,需要解析成可直接使用的JS数组/对象 const hospitalList = JSON.parse(fileContent); return hospitalList; } catch (error) { console.error('读取医院列表失败:', error); // 根据业务需求返回默认值,比如空数组,避免后续渲染报错 return []; } };
代码说明
- 用
try/catch替代.catch,更贴合async/await的同步风格写法,错误处理逻辑更清晰; - 直接
await方法调用,就能拿到文件的字符串内容,不需要在.then里手动给result赋值; - 必须解析JSON:
readAsStringAsync返回的是纯文本字符串,你需要通过JSON.parse转成可直接渲染的数组/对象。
组件中正确调用该函数
因为getHospitals是async函数,它返回的是Promise,所以调用时也需要用await来等待结果,再更新状态渲染页面:
函数组件示例
import { useState, useEffect } from 'react'; import { View, Text } from 'react-native'; // 假设这是你的组件 const HospitalList = () => { const [hospitals, setHospitals] = useState([]); useEffect(() => { const loadHospitals = async () => { const list = await getHospitals(); setHospitals(list); }; loadHospitals(); }, []); return ( <View> {hospitals.map(hospital => ( <Text key={hospital.id}>{hospital.name}</Text> ))} </View> ); };
类组件示例
import { Component } from 'react'; import { View, Text } from 'react-native'; class HospitalList extends Component { state = { hospitals: [] }; componentDidMount() { this.loadHospitals(); } loadHospitals = async () => { const list = await this.getHospitals(); this.setState({ hospitals: list }); }; getHospitals = async () => { // 这里放上面修正后的getHospitals代码 }; render() { return ( <View> {this.state.hospitals.map(hospital => ( <Text key={hospital.id}>{hospital.name}</Text> ))} </View> ); } }
额外提示
如果还是遇到未处理的Promise拒绝错误,检查调用getHospitals的地方是否正确用try/catch捕获了错误,或者确保函数内部的catch块能覆盖所有异常情况。
内容的提问来源于stack exchange,提问作者Goodmedalist
相关产品推荐
相关产品推荐

