node.js 回调函数事件循环EventEmitter ar

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js 回调函数事件循环EventEmitter ar相关的知识,希望对你有一定的参考价值。

异步编程 

node.js 编程的直接体现就是回调,异步编程依托于回调来实现: node使用了大量的回调函数,所有API都支持回调函数 。如读取文件等。

这里对不懂线程和异步和同步的稍微解释下这三个名词 。 

线程 : 简单的说就是做一件事 . 即执行一段程序代码 。js引擎就是一个单线程 的 处理 方式 .单线程是说 同一时间只能做一件事 。 

同步 :就是这件事必须要先做完前面的才能做后面的,否则后面的无法完成. 这就像我们的js代码会从上往下 运行 .

异步 :简单的说就是两个线程,你做你的,我做我的,相互并不影响。

并发 :就是 说多个异步线程同时运行, 所以 这种情况 处理效果最高 ,也是我们大多 数时候的处理方式  。

同步的情况下,这件事必须从上 往 下 , 当然 也可以是两个线程, 但这两个线程 必须前一个做完才能执行下一个 .  

    如  :function  fun(){

                 var x=1; //先运行 此行 

      var y=1;//再运行此行 

       consoel.log(x+y);//最后运行此行     

         }

            fun();  //调用 fun函数 

异步的情况下 ,  大家各干各的,说不准说先做完 谁后做完 .

 如 :      console.log("12221");

             setTimeout(function(){

      console.log("111");

      },1000);

     console.log("13331");

       这个定时器,setTimeout会开启一个异步的线程,等一秒后再执行回调函数里的代码 .并不行阻塞 13331 的输出执行 . 

当然这里还有一个异步并发安全的问题,即是说当两个异步的线程 同时做一件事时  就会产生异步并发的安全问题 .

node 回调函数   

好了,这里继续讲 node 的 回调函数。

下面以 阻塞代码和非阻塞代码为例 :

阻塞代码 : var fs=require("fs");  // 获取fs模块  即文件读取模块 

      var data=fs.readFileSync("input.txt");//读取input.txt 文件  文件内容是  菜鸟教程官网地址:www.runoob.com

      console.log(data.toString());

      console.log("程序执行结束");

执行 :文件存放 在  D:\\softSetting\\node\\a 文件夹下  ,所以 : 执行代码如下 

技术分享

下面再来个非阻塞的读取文件的例子:

        同样的  D:\\softSetting\\node\\a  文件夹下 创建 main2.js 

  var fs=require("fs");

  fs.readFile("input.txt",function(err,data){

    if(err){ return console.error(err);}

      console.log(data.toString());

  }); 

   console.log("程序执行结束");

执行 :

  技术分享

node 的回调函数 是这样的:function(err,data){  }

err 表示 错误 ,当 回调函数 执行 出错时 自动出现err 内容 , data表示回调函数接收数据 。

node 事件循环 -这个比较难 

 node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高 

node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。这个下一章单独讲 。

node.js 单线程类似进入一个while(true) 的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。

技术分享

以上是node 事件循环的基本模型,也被称为非阻塞式IO或事件驱动IO , webserver 一直接受请求而不等待任何读写操作,EventEmitter 绑定事件on并监听事件(Event) . 

在事件驱动模型中,会生成一个主循环Event Loop听事件,当检测到事件时触发回调函数 Event Handlers . 

EventEmitter 补充 : 

 

 

 

 

 

 

 

             

 

以上是关于node.js 回调函数事件循环EventEmitter ar的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 事件循环

node事件循环

Node.js 事件循环

Node.js 事件循环

Node.js 事件循环

nodejs 事件循环