• 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);
  • 相关阅读:
    【转】机器学习算法一览,应用建议与解决思路
    机器学习笔记04(Logistic Regression)
    机器学习笔记03(Classification: Probabilistic Generative Model)
    机器学习笔记00(课程结构)
    .Net PE
    wpf 画五角星函数
    .Net Core CLR FileFormat Call Method( Include MetaData, Stream, #~)
    天子守国门,君王死社稷
    CoreCLR Host源码分析(C++)
    Core CLR Host 源码简单分析
  • 原文地址:https://www.cnblogs.com/qiaohong/p/8456812.html
Copyright © 2020-2023  润新知