Node.js的回调函数以及事件循环

来源:互联网 发布:linux cp命令 覆盖 编辑:程序博客网 时间:2024/05/14 14:04

Node.js回调函数

Node.js是单进程单线程应用程序,但是可以通过事件和回调支持并发操作

Node.js的异步编程依托于回调实现。Node.js中有大量的回调函数函数,Node的所有API都支持回调函数。

异步编程就是并发性的运行程序。使得可以同时运行多项工作减少了设备的阻塞和等待。可以处理大量的并发请求。

阻塞实例:

var fs = require("fs");var data = fs.readFileSync('input.txt');console.log(data.toString());

非阻塞代码实例

var fs = require("fs");fs.readFile('input.txt',function(err.data){    if(err) return console.error(err);    console.log(data.toString());    });

阻塞是按顺序执行,非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们需要写在回调函数内。

事件循环

Node.js基本上所有的事件机制都是用设计模式中观察者模式实现

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
这里写图片描述

驱动的流程如图,事件由web server接收,并放入到事件队列中,又由Event Handlers 来调用相应的处理来处理事件。

实例:

//引入events模块,其实就是不断的调用触发事件,但是实现定义好关联好事件与Observervar events = require('events');//引入Events模块var eventEmitter = new events.EventEmitter();//创建evetEmitter对象,每一个事件的循环都需要以上两步//创建事件处理程序var connetHandler = function connected(){    console.log('连接成功');    //触发 data_received事件    eventEmitter.emit('data_received');    }//绑定connection事件处理程序eventEmitter.on('connection',connectionHanlder);//使用匿名函数绑定data_received事件eventEmitter.on('data——received',function(){    console.log('数据接收成功');    });//触发connection事件eventEmitter.emit('connection');console.log("程序执行完毕。");
原创粉丝点击