Node.js 事件驱动获取数据
来源:互联网 发布:mac电子书导入kindle 编辑:程序博客网 时间:2024/05/16 16:12
Nodejs的单线程非阻塞I/O事件驱动
在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。 而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时 连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器 的数量,而 Web 应用程序的硬件成本当然就上升了。 Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了, 就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。 使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过4 万用户的连接。
Nodejs 回调处理异步
//错误的写法: function getData (){ // 模拟请求数据 var result=''; setTimeout(function(){ result='这是请求到的数据' },200); return result; } console.log( getData ()); /* 异步导致请求不到数据 */
// 正确的处理异步 : function getData (callback){ // 模拟请求数据 var result=''; setTimeout (function(){ result='这是请求到的数据'; callback(result); },200); } getData (function( data ){ console.log(data); });
Nodejs events 模块处理异步
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件。
/* Node.js 事件循环: Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。 Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件, 如下实例:* */// 引入 events 模块var events=require('events');//console.log(events);var EventEmitter=new events.EventEmitter();//广播 和接收广播EventEmitter.on('to_mime',function(data){ console.log(data);})//监听to_parent的广播EventEmitter.on('to_parent',function(data){ //console.log('接收到了这个广播事件'); console.log(data); EventEmitter.emit('to_mime','给mime发送的数据')})setTimeout(function(){ console.log('开始广播...'); //广播to_parent事件 EventEmitter.emit('to_parent','发送的数据')},1000);
我的上一篇博文:http://blog.csdn.net/cckevincyh/article/details/78637576
中读取mime.json文件,返回指定mime type,我们使用的是回调来处理异步。现在我们改造一下,通过events 模块来处理异步。
我们现在测试下我们的代码:
var fs=require('fs');var events=require('events');var EventEmitter=new events.EventEmitter();function getMime(){ fs.readFile('mime.json',function(err,data){ EventEmitter.emit('data',data) })}getMime();/*执行方法*///监听广播数据EventEmitter.on('data',function(mime){ console.log(mime.toString());})
好了,通过events 模块我们可以获取到我们的数据了,现在我们开始改造我们的代码:
exports.getMime=function(fs,EventEmitter,extname){ /*获取后缀名的方法*/ fs.readFile('./mime.json',function(err,data){ if(err){ console.log('mime.json文件不存在'); return false; } //console.log(data.toString()); var Mimes=JSON.parse(data.toString()); var result= Mimes[extname] || 'text/html'; EventEmitter.emit('to_mime',result); })}
//引入http模块var http=require('http');//fs模块var fs=require('fs');//path模块var path=require('path'); /*nodejs自带的模块*///url模块var url=require('url');var events=require('events');var EventEmitter=new events.EventEmitter();var mimeModel=require('./model/getmimefromfile_events.js');//引入扩展名的方法是在文件里面获取到的。//console.log(mimeModel.getMime('.css')); //获取文件类型http.createServer(function(req,res){ //http://localhost:8001/news.html /news.html //http://localhost:8001/index.html /index.html //css/dmb.bottom.css //xxx.json?214214124 var pathname=url.parse(req.url).pathname; console.log(pathname); if(pathname=='/'){ pathname='/index.html'; /*默认加载的首页*/ } //获取文件的后缀名 var extname=path.extname(pathname); if(pathname!='/favicon.ico'){ /*过滤请求favicon.ico*/ //console.log(pathname); //文件操作获取 static下面的index.html fs.readFile('static/'+pathname,function(err,data){ if(err){ /*没有这个文件*/ console.log('404'); fs.readFile('static/404.html',function(error,data404){ if(error){ console.log(error); } res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"}); res.write(data404); res.end(); /*结束响应*/ }) }else{ /*返回这个文件*/ mimeModel.getMime(fs,EventEmitter,extname); /*调用获取数据的方法*/ EventEmitter.on('to_mime',function(mime){ res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"}); //res.write(data); res.end(data); /*结束响应*/ }) } }) }}).listen(8002);
setMaxListeners():
在默认情况下,同一个指定的事件,最多可以绑定10个事件处理函数。当绑定数超出时,启动nodejs时,会有相应的错误提示。也可以通过下面的方法修改:
EventEmitter.setMaxListeners (n) //给EventEmitter设置最大监听//参数1: n 数字类型,最大监听数
阅读全文
0 0
- Node.js 事件驱动获取数据
- Node.js事件驱动
- node.js 之事件驱动
- Node.js[2] 事件驱动
- node.js的事件驱动
- Node.js事件驱动编程
- node.js(二) 模块 事件驱动
- Node.js中的事件驱动编程详解
- 理解Node.js事件驱动编程
- 理解Node.js事件驱动编程
- 理解Node.js事件驱动编程
- node.js util全局变量 事件驱动events
- Node.js 异步式 I/O 与事件驱动
- node.js(一)包管理、缓冲区、事件驱动、定时器
- node.js 基于事件驱动的回调
- Node.js异步式I/O与事件驱动
- 理解Node.js的事件驱动和异步编程
- node.js util全局变量和事件驱动events
- python生成器
- AC自动机
- jsp中页码的实现
- thinkphp路由+伪静态+ index.php
- 1050. 螺旋矩阵(25)
- Node.js 事件驱动获取数据
- Android Studio Module相关笔记
- Idea最常用快捷键
- VMWare使用NAT网络连接总结
- ORACLE 11G 中采用rman备份异机恢复数据库详细过程
- Oracle之PLSQL(PLSQL Developer)安装、注册、汉化-yellowcong
- 技术分享- RxJS与Redux-Observable简介
- 整合一下深度学习caffe环境配置和基本使用例程(CPU+GPU)
- 各种跟踪算法 简介