• node.js学习


    1,感谢菜鸟教程

    2,安装不多赘述

    3,我的第一个nodejs程序

    node.js主要是用javascript写服务端

    var http=require("http");    //实例化一个require对象,这样我们以后就可以用它内部的方法了!
    http.createServer(function(request,response){    //创建一个服务
        response.writeHead(200,{"Content-Type":'text/plain'});    //为请求相应200和content-type头
        response.end("hello world!lalala");    //发送相应数据
    }).listen(8888);
    console.log("server running at http://127.0.0.1:8888/");    //运行界面上打印提示信息

    4,npm

    我觉得,npm相对于nodejs相当于pip对于python,所以npm相当于nodejs的包管理工具,

    npm install express          # 本地安装    将安装包放在 ./node_modules 下
    npm install express -g   # 全局安装  将安装包放在 /usr/local 下或者 node 安装目录。
    
    //可以通过 require() 来引入本地安装的包。

    使用淘宝镜像cnpm

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    5,repl(node交互式页面用的编程语言)

    常用命令:

    .exit退出nodejs交互式界面
    
    .help - 列出使用命令
    
    .break - 退出多行表达式
    
    .clear - 退出多行表达式
    
    .save filename - 保存当前的 Node REPL 会话到指定文件
    
    .load filename - 载入当前 Node REPL 会话的文件内容。

    6,回调函数

    我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

    格式:

    function foo2(value, callback1, callback2) { }

     所谓的阻塞和非阻塞,就是在执行代码的时候有些进程能否并行。

    准备,再当前位置创建一个txt文件,daqing.txt,内容是:hello daqing!

    //阻塞的实例
    var fs=require("fs");    //这个有点像python里的os
    var data=fs.readFileSync("daqing.txt");
    console.log(data.toString());
    console.log("阻塞结束!");
    
    //非阻塞的实例
    var fs=require("fs");
    fs.readFile("daqing.txt",function(err,data){    //在下达读取的命令以后,直接去注册function,读取的结果被当作data传入已经注册过的函数,这就是回调函数,由于多件事并行,会点函数比较节约时间。
        if(err)return console.log(err);
        console.log(data.toString());
    });
    console.log("非阻塞结束!");

    7,事件循环

    事件的工作原理就好像商家接收外卖,就像一个外卖店家,你可以不停地接收很多外卖,一份一份做完了,让小哥送出去,这个过程是并行的,如果不是并行,那就只能接收一份,做完送出,然后接收下一份,事件可以不停接收和发生,可以提高效率。

    事件就是需要 eventEmitter.on 去绑定一个事件 通过 eventEmitter.emit 去触发这个事件。

    var events=require("events");    //监听事件模块
    var eventEmitter=new events.EventEmitter();    //创建监听对象
    
    var connectHandler=function connected(){
        console.log("连接成功!");
        eventEmitter.emit("data_received");    //触发data_received事件
    }
    
    eventEmitter.on("connection",connectHandler);    //绑定事件和处理程序
    eventEmitter.on("data_received",function(){    //匿名函数绑定data_received
        console.log("数据接收成功!");
    })
    eventEmitter.emit("connection");    //触发connection事件
    console.log("程序执行完毕!")
    
    //结果会返回:
    //连接成功!    //随后触发了data_received事件
    //数据接收成功!
    //程序执行完毕!
    
    //但是我不知道为什么connection事件再次触发了connectionHandler却没有打印出任何东西,再学学

     8,事件的注册和触发

    注册和触发事件:

    //var events=require("events");
    //var eventEmitter=new events.EventEmitter();
    
    var EventEmitter = require('events').EventEmitter; //引入并且实例化,和上面两句作用一样
    var event = new EventEmitter(); 
    event.on('some_event', function() {     //注册了some_event的一个监听器函数,这个函数会输出一堆东西到屏幕
        console.log('some_event start'); 
    }); 
    setTimeout(function() { 
        event.emit('some_event'); //当事件触发时候,自动激活注册了的函数
    }, 1000); 

    //结果返回some_event start

    为一个事件注册多个function:

    //event.js 文件
    var events = require('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', 'arg1 canshu', 'arg2 canshu'); 
    
    //为一个事件注册多个函数以后,回调函数会按照注册的先后顺序执行

    on 函数用于绑定事件函数,emit 属性用于触发一个事件。

    常用的emitter方法:

    序号方法 & 描述
    1 addListener(event, listener)
    为指定事件添加一个监听器到监听器数组的尾部。
    2 on(event, listener)
    为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
    server.on('connection', function (stream) {
      console.log('someone connected!');
    });
    3 once(event, listener)
    为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
    server.once('connection', function (stream) {
      console.log('Ah, we have our first user!');
    });
    4 removeListener(event, listener)

    移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

    它接受两个参数,第一个是事件名称,第二个是回调函数名称。

    var callback = function(stream) {
      console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback);
    5 removeAllListeners([event])
    移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
    6 setMaxListeners(n)
    默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
    7 listeners(event)
    返回指定事件的监听器数组。
    8 emit(event, [arg1], [arg2], [...])
    按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

    类方法:

    序号方法 & 描述
    1 listenerCount(emitter, event)
    返回指定事件的监听器数量。

    实例:events.emitter.listenerCount(eventName) 

    var events = require('events');
    var eventEmitter = new events.EventEmitter();
    
    // 监听器 #1
    var listener1 = function listener1() {
       console.log('监听器 listener1 执行。');
    }
    
    // 监听器 #2
    var listener2 = function listener2() {
      console.log('监听器 listener2 执行。');
    }
    
    // 绑定 connection 事件,处理函数为 listener1 
    eventEmitter.addListener('connection', listener1);
    
    // 绑定 connection 事件,处理函数为 listener2
    eventEmitter.on('connection', listener2);
    
    var eventListeners = eventEmitter.listenerCount('connection');
    console.log(eventListeners + " 个监听器监听连接事件。");
    //返回 2 个监听器监听连接事件。
    
    // 处理 connection 事件 
    eventEmitter.emit('connection');
    //监听器 listener1 执行。
    //监听器 listener1 执行。
    
    // 移除监绑定的 listener1 函数
    eventEmitter.removeListener('connection', listener1);
    console.log("listener1 不再受监听。");
    //listener1 不再受监听。
    
    // 触发连接事件
    eventEmitter.emit('connection');
    //监听器 listener2 执行。
    
    eventListeners = eventEmitter.listenerCount('connection');
    console.log(eventListeners + " 个监听器监听连接事件。");
    //1 个监听器监听连接事件。
    console.log("程序执行完毕。");
    //程序执行完毕。

    error 事件:

    EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常

    报错实例:

    var events = require('events'); 
    var emitter = new events.EventEmitter(); 
    emitter.emit('error');
  • 相关阅读:
    NewtonSoft.Json
    属性
    csv文件
    C#和递归算法实现删除,清空,拷贝目录
    朴素贝叶斯应用:垃圾邮件分类
    压缩图片
    numpy分布图
    鸢尾花
    numpy数组及处理:效率对比
    完整的中英文词频统计
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/10077795.html
Copyright © 2020-2023  润新知