• Node.js入门(二)


    一、事件

    所有产生Node.js事件的对象都是 events.EventEmitter 的实例,即:

    //event.js
    
    var EventEmitter = require('events').EventEmitter;
    
    var event = new EventEmitter();
    
    event.on('some_event',function (){  //注册事件some_event的一个监听器
    
      console.log('some_event occured.');
    
    });
    
    setTimeout(function (){
    
      event.emit('some_event');  //发送事件
    
    },1000);

    EventEmitter示例:

    var events = require('events');  //引入events模块
    var emitter = new events.EventEmitter();
    
    emitter.on('someEvent',function (arg1,arg2){    //事件监听器
      console.log('listener1',arg1,arg2);
    });
    emitter.on('someEvent',function (arg1,arg2){    //另一个事件监听器
      console.log('listener2',arg1,arg2);
    });
    emitter.emit('someEvent','liuqiuchen','27');    //事件发射,注册到这个事件的事件监听器被依次调用

    EventEmitter常用API:

    *emitter.on(event,listener);
    *emitter.addListener(event,listener);
    *为指定事件注册一个监听器,接收一个字符串event和一个回调函数listener
    *
    *emitter.emit(event,[arg1],[arg2],[...]);发射event事件
    *
    *emitter.once(event,listener);为事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器
    *
    *emitter.removeListener(event,listener);移除指定事件的某个监听器,listener必须是该事件已经注册过的监听器
    *
    *emitter.removeAllListeners([event]);移除所有事件的所有监听器,如果指定event,则移除指定事件的所有监听器。

    测试代码:

    emitter.on('connection',function (stream){
      console.log('someone connected!');
    });
    emitter.emit('connection');
    
    emitter.addListener('addListener',function (name,age){
      console.log(name + age);
    });
    emitter.emit('addListener','YourName',27);
    
    emitter.once('only_once_event',function (){
      console.log('only_once');
    })
    emitter.emit('only_once_event');
    
    var callback1 = function (stream){
      console.log('person1 connected');
    };
    var callback2 = function (stream){
      console.log('person2 connected');
    };
    emitter.on('connection',callback1);
    emitter.on('connection',callback2);
    //emitter.emit('connection');
    emitter.removeListener('connection',callback1);
    //emitter.emit('connection');
    emitter.removeAllListeners('connection');
    emitter.emit('connection');

    error事件
    我们在遇到异常的时候通常会发射error事件

    var events = require('events');
    var emitter = new events.EventEmitter();
    emitter.emit('error');

    二、函数

    1 function execute(someFunction,value){
    2   someFunction(value);
    3 }
    4 
    5 function say(word){
    6   console.log(word);
    7 }
    8 
    9 execute(say,'Hello');

    匿名函数:

    1 function execute(someFunction,value){
    2   someFunction(value);
    3 }
    4 execute(function (word){console.log(word)},'Hello');

    函数传递是如何让HTTP服务器工作的

    1 var http = require('http');
    2 
    3 http.createServer(function (request,response){      //我们向createServer()函数传递了一个匿名函数
    4   response.writeHead(200,{'Content-Type':'text/plain'});
    5   response.write('Hello World');
    6   response.end();
    7 }).listen(8888);

    同下:

    1 var http = require('http');
    2 http.createServer(onRequest).listen(8888);
    3 
    4 function onRequest(request,response){
    5   response.writeHead(200,{'Content-Type':'text/plain'});
    6   response.write('Hello world');
    7   response.end();
    8 }

    三、路由(URL)

    url.parse(string).query
                                               |
               url.parse(string).pathname      |
                           |                   |
                           |                   |
                         ------ -------------------
    http://localhost:8888/start?foo=bar&hello=world
                                    ---       -----
                                     |          |
                                     |          |
                  querystring(string)["foo"]    |
                                                |
                             querystring(string)["hello"]

    详见:http://nodeapi.ucdok.com/#/api/url.html

    创建两个模块的公开接口

    1 //router.js
    2 
    3 function route(pathname){
    4   console.log('About to route a request for ' + pathname);
    5 }
    6 
    7 exports.route = route;    //模块公开的接口
     1 //server.js
     2 
     3 var http = require('http');
     4 var url = require('url');
     5 
     6 function start(route){
     7   function onRequest(request,response){
     8 
     9   var pathname = url.parse(request.url).pathname;
    10   route(pathname);
    11 
    12   response.writeHead(200,{'Content-Type':'text/plain'});
    13   response.write('Hello world');
    14   response.end();
    15   }
    16 
    17   http.createServer(onRequest).listen(8888);
    18   console.log('Server has started');
    19 }
    20 
    21 exports.start = start;
    1 //调用文件index.js
    2 
    3 var server = require('./server');
    4 var router = require('./router');
    5 
    6 //server.start(router.route);    //Server has started
    7 server.start(router.route('http://www.baidu.com'));    //About to route a request for http://www.baidu.com
  • 相关阅读:
    阻止事件冒泡
    移动端开发
    angular6 管道多参数传输 Pipe
    在div上添加小三角
    angular6 使用@Input() @Output()
    angular6 想要获取页面某些事件 如 点击 window宽高等等
    如何将项目添加到git上
    使用vue-cli 搭建element-admin后台
    bootstrap4 常用样式类名 (供自己参考)
    键盘按下 keyCode 的值
  • 原文地址:https://www.cnblogs.com/liuqiuchen/p/4517586.html
Copyright © 2020-2023  润新知