node之拿到异步数据的两种方法

第一种方法是使用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);
原文地址:https://www.cnblogs.com/qiaohong/p/8456812.html