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

如何正确获取JavaScript中async异步函数的返回值

问题根因
  • async函数的返回值会自动封装为Promise,但你代码里的return chunk是写在data事件的回调函数内,该返回值仅作用于回调本身,无法透传到外层readData函数的返回结果中
  • 你当前调用readData后拿到的是默认返回的undefined,因为函数本身没有返回绑定流处理结果的Promise
  • 另外流的data事件会在每次拿到数据块时触发,直接返回单次chunk也拿不到完整的文件内容
修正后的实现代码
class ReadFile{
    constructor(){
        this.fs = require('fs')
    }

    async readData(pathToFile){
        // 手动封装Promise绑定流的处理状态
        return new Promise((resolve, reject) => {
            const readStream = this.fs.createReadStream(pathToFile, 'utf-8');
            let fullContent = ''
            // 拼接所有数据块
            readStream.on('data', (chunk) => {
                fullContent += chunk
            })
            // 流读取完成后返回完整内容
            readStream.on('end', () => {
                resolve(fullContent)
            })
            // 捕获读取错误
            readStream.on('error', (err) => {
                reject(err)
            })
        })
    }
}

const read = new ReadFile();
async函数获取返回值的两种通用方式

方式1:用.then链式调用

// then的回调参数就是函数返回的结果,catch用于捕获异步错误
read.readData('./resources/src/index.html')
  .then(console.log)
  .catch(console.error)

方式2:用await关键字调用

注意await必须写在其他async函数内部,推荐搭配try/catch捕获异步错误:

// 用自执行async函数包裹await调用
;(async () => {
  try {
    const fileContent = await read.readData('./resources/src/index.html')
    console.log(fileContent)
  } catch (err) {
    console.error('读取失败:', err)
  }
})()

如果是Node.js v16.15.0以上版本,还可以直接用内置的stream/consumers模块简化流的处理,无需手动拼接数据和封装Promise:

const { readToString } = require('node:stream/consumers')

async readData(pathToFile){
  const readStream = this.fs.createReadStream(pathToFile, 'utf-8')
  return readToString(readStream)
}

内容的提问来源于stack exchange,提问作者buxxxbaum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:45:03