1.node中的异步编程
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使⽤了回调后程序就异步化了。
回调函数在完成任务后就会被调⽤,Node 使⽤了⼤量的回调函数,Node 所有 API 都⽀持回调函数。
例如,我们可以⼀边读取⽂件,⼀边执⾏其他命令,在⽂件读取完成后,我们将⽂件内容作为回调函数的参数返回。这样在执⾏代码时就没有阻塞或等待⽂件 I/O 操作。这就⼤⼤提⾼了Node.js 的性能,可以处理⼤量的并发请求。
2.阻塞代和非阻塞例子
//nodejs的异步体现在回调函数上
//这个是阻塞的代码(同步)
const fs = require("fs");
const syncData = fs.readFileSync("./01node.js"); //文件读取操作完成之后,再往下执行
console.log("我是同步阻塞的代码返回的data",syncData.toString());
//这个是非阻塞的代码(异步)
const asyncData = fs.readFile("./01node.js",function(err,data){
//错误优先机制:例如readFild加载文件出错,会先处理错误,没报错再处理读取的文件内容
if(err){
console.log("雾草报错了~!",err);
return
}else{
console.log("输出data数据",data.toString())
}
})
console.log("我是先执行的") //这里会先执行
🌵附上运行后的打印结果图:
3.使用util的promisify化以及generator的使用
- 对fs内置模块的readFile方法进行promise化处理
//🤪promise化例子
const {promisify} = require("util");
//对fs内置模块的readFile方法进行promise化处理
const readFile = promisify(fs.readFile);
async function asyncReadContent(){
try {
const data =await readFile("./01node.js");
console.log("🌵我是使用primise化后的读取结果",data.toString());
} catch (error) {
console.log("我报错了",error.stack);//打印出报错的位置信息
}
}
asyncReadContent();
//generator例子
function* read() {
yield readFile('./01-runnode.js'); //这里的readFile是被primisify处理过的哈🤪
}
let ge = read();
ge.next().value.then((data) => {
console.log(data.toString());
}).catch((err) => {
console.log(err);
});