标签:
异步编程
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