码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-07-05 06:19:36      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

异步编程 

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

标签:

原文地址:http://www.cnblogs.com/hyxiaoxiao/p/5642182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!