Node.js中fs.readFile/fs.readFileSync执行顺序异常求助
问题分析与解决
核心问题出在你对fs模块同步/异步方法的用法误解上:
- 你给**同步方法
fs.readFileSync**加了回调函数,但这个方法根本不接受回调参数,直接返回文件内容,所以你写的回调逻辑完全不会执行,自然看不到readfile began!这类日志。 - 要是换成异步的
fs.readFile,它是非阻塞的——主线程会直接跳过异步逻辑,先执行后面的let userarry = [nms]和while循环,等文件读取完成时,主线程已经卡在循环里,回调代码也没法运行。
正确的同步读取写法
用readFileSync就去掉回调,直接获取返回值:
const prompt = require('prompt-sync')(); let fs = require('fs'); function aFuncName() { let nms; try { // 同步读取直接拿到文件内容,无需回调 const data = fs.readFileSync('filename.txt', 'utf8'); console.log('readfile began!'); // 加g全局匹配所有换行,避免只统计第一个 const lineMatches = data.match(/\n/g); // 处理没匹配到换行的情况(避免TypeError) nms = lineMatches ? lineMatches.length : 0; console.log(`ind: ${nms}`); // 原代码里的ind是未定义变量,这里修正为nms console.log("readfile over!"); } catch (error) { // 捕获文件读取错误(比如文件不存在) console.log(error); nms = 0; } let userarry = [nms]; while (true) { let vars = prompt('varsm):'); } } // 别忘了调用函数 aFuncName();
异步读取的正确写法(fs.readFile)
异步逻辑要保证执行完再进入循环,有两种方式:
回调嵌套版
把后续代码放到回调函数里:
const prompt = require('prompt-sync')(); let fs = require('fs'); function aFuncName() { fs.readFile('filename.txt', 'utf8', (error, data) => { console.log('readfile began!'); let nms = 0; if (error) { console.log(error); } else { const lineMatches = data.match(/\n/g); nms = lineMatches ? lineMatches.length : 0; console.log(`ind: ${nms}`); } console.log("readfile over!"); // 确保文件读取完成后再执行后续逻辑 let userarry = [nms]; while (true) { let vars = prompt('varsm):'); } }); } aFuncName();
async/await版(更易读)
用Promise版的fs配合async/await:
const prompt = require('prompt-sync')(); // 引入Promise版的fs模块 let fs = require('fs').promises; async function aFuncName() { let nms = 0; try { console.log('readfile began!'); // await等待异步读取完成 const data = await fs.readFile('filename.txt', 'utf8'); const lineMatches = data.match(/\n/g); nms = lineMatches ? lineMatches.length : 0; console.log(`ind: ${nms}`); console.log("readfile over!"); } catch (error) { console.log(error); } let userarry = [nms]; while (true) { let vars = prompt('varsm):'); } } aFuncName();
内容的提问来源于stack exchange,提问作者solac34
相关产品推荐
相关产品推荐

