我们知道,node.js在读取文件的时候可以分为阻塞和非组塞读取,阻塞就是得文件读取完毕后再继续执行后面的程序,如下代码所示:
const fs = require('fs');
const data = fs.readFileSync('file/input.txt');
console.log(data.toString());
console.log("程序执行完毕!");
input.txt
这是一个node.js阻塞和非阻塞测试!
执行结果:
![]()
而阻塞带来的问题是,会导致后边的程序一直再等待这个阻塞进程执行完毕再执行,这样一来降低程序执行效率。因而JavaScript采用异步处理的方式来实现非阻塞,传统的异步处理一般是采用异步回调方法:
const fs = require('fs');
const data = fs.readFile('file/input.txt', (err, data) => {
if (err) {
return console.error(err);
}
console.log(data.toString());
});
console.log("程序执行完毕!")
执行结果:
![]()
但回调处理异步的方式会带来多层嵌套时代码会比较混乱的问题,那么如何更优雅的展示读取文件或者其他异步操作呢?可以使用promise, generator和aysnc/await方法来处理异步:
(1)promise
const fs = require('fs');
const readFile = function(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if (err) {
reject(err);
}
resolve(data);
})
})
}
readFile('file/input.txt').then(data =>{
console.log(data.toString());
}).then(()=> {
console.log('success!')
}).then(() => {
console.log("执行完毕!");
});
执行结果

(2)Generator
function * ascReadFile() {
yield readFile('file/input.txt');
yield "success!";
yield "执行完毕!";
}
let gen = ascReadFile();
gen.next().value.then(data => {
console.log(data.toString());
return gen.next().value;
}).then(data => {
console.log(data);
return gen.next().value;
}).then(data => {
console.log(data);
})
执行结果:

3)async/await
async function aysncReadFile() {
let data = await readFile('file/input.txt'); //调用的是promise方法中封装好的方法
console.log(data.toString());
console.log('success!');
console.log('执行完毕!');
}
aysncReadFile();
执行结果:

本文介绍了Node.js中三种异步读取文件的方法:传统回调、Promise以及使用Generator和async/await。通过示例展示了它们如何避免阻塞并提高程序执行效率,特别是Promise和async/await能更好地解决回调地狱问题,提供更优雅的异步处理方式。
1187

被折叠的 条评论
为什么被折叠?



