第一种方法是使用callback来拿到异步的数据,以以往文章创建一个简单的web服务器为例
首先看个callback的demo
var fs=require('fs'); function getMime(callback){ fs.readFile('mime.json',function(err,data){ //console.log(data.toString()); //return data; callback(data); }) } getMime(function(result){ console.log(result.toString()); })
然后改造getmimefromfile.js
exports.getMime=function(fs,extname,callback){ /*获取后缀名的方法*/ 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'; callback(result) }) }
然后是入口的js
//引入http模块 var http=require('http'); //fs模块 var fs=require('fs'); //path模块 var path=require('path'); /*nodejs自带的模块*/ //url模块 var url=require('url'); //引入扩展名的方法是在文件里面获取到的。 var mimeModel=require('./model/getmimefromfile.js'); //console.log(mimeModel.getMime('.css')); //获取文件类型 http.createServer(function(req,res){ 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{ /*返回这个文件*/ var mime=mimeModel.getMime(fs,extname,function(mime){ res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"}); res.write(data); res.end(); /*结束响应*/ }); } }) } }).listen(8002);
这个就是使用callback处理异步返回来的数据。
那么下面就开始使用广播的方法来拿到这个数据
首先还是看个广播的demo
/* 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);
看看使用这个广播能不能拿到数据
var fs=require('fs'); var events=require('events'); var EventEmitter=new events.EventEmitter(); function getMime(callback){ fs.readFile('mime.json',function(err,data){ EventEmitter.emit('data',data) }) } getMime();/*执行方法*/ //监听广播数据 EventEmitter.on('data',function(mime){ console.log(mime.toString()); })
发现是可以拿到的
那么改引用的js
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); }) }
改入口的js
//引入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){ 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);