Node系列-02-Node中的异步编程

213 阅读1分钟

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);
});