如何正确获取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
相关产品推荐
相关产品推荐

