node.js异步读取文件的方法

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

我们知道,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();

执行结果:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值