使用async/await逐文件读取为何输出顺序与预期不符?
问题原因分析及解决方案
这个问题的核心在于你的readfile函数没有正确返回一个可被await等待的Promise,导致两个文件读取操作实际上是并行执行的,而非你预期的串行顺序。
具体问题点拆解:
- 函数无有效返回值:你的
readfile函数没有任何return语句,默认返回undefined。当await遇到undefined时,JavaScript会直接将其视为一个已完成的Promise,所以第一个await readfile(...)会立即结束,紧接着就执行第二个文件的读取——两个文件的读取流几乎同时启动,谁的close事件先触发就先输出,顺序完全不可控。 - 内部Promise无效:你在
close事件回调里创建的Promise既没有被resolve,也没有被返回给函数外部,这个Promise完全是孤立的,和外部的await没有任何关联,根本起不到等待的作用。
修正后的代码
要实现逐文件串行读取,我们需要让readfile返回一个Promise,并在文件读取完成(close事件触发)时正确resolve这个Promise,同时处理可能的读取错误:
function readfile(file) { const readline = require('readline'); const fs = require('fs'); // 返回一个Promise,让await可以等待异步操作完成 return new Promise((resolve, reject) => { const fReadAD = fs.createReadStream(file, { encoding: 'utf8' }); const objReadlineAD = readline.createInterface({ input: fReadAD }); // 处理文件读取错误(比如文件不存在) fReadAD.on('error', (err) => { reject(err); }); objReadlineAD.on('close', () => { console.log('file:' + file); resolve(); // 通知await:这个文件的读取操作已完成 }); }); } (async () => { try { await readfile('./import/1.xls'); await readfile('./import/2.csv'); } catch (err) { // 捕获并处理读取过程中的错误 console.error('文件读取失败:', err); } })();
修正后的逻辑说明:
- 现在
readfile函数返回一个Promise,await会等待这个Promise被resolve后才会执行下一行代码,确保两个文件的读取是串行的。 - 新增了错误处理逻辑,避免某个文件读取失败导致整个异步流程崩溃。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

