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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:47:30