zoukankan      html  css  js  c++  java
  • Node js 安装+回调函数+事件

    /*
    从网站 https://nodejs.org/zh-cn/ 下载 这里用的 9.4.0 版本
    下载完安装
    安装目录是 D:ApacheServer
    ode
    一路默认安装
    安装后打开cmd命令行输入
    path
    在显示的结果中查找是否有 D:ApacheServer
    ode
    有的话表示环境变量中已经包含了 D:ApacheServer
    ode 可以在cmd中直接使用 node 这个命令
    如在当前命令行中输入
    node --version
    显示
    v9.4.0
    当前nodejs的版本
    
    
    
    
    
    =========================输出 Hello World
    编写代码前先了解node运行情况
    如果使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi。
    从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理。
    不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器(请求的获取返回,监听的端口)。
    
    
    先了解下 Node.js 应用是由哪几部分组成的
    一 引入 required 模块 : 可以使用 require 指令来载入 Node.js 模块。
    二 创建服务器                : 服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
    三 接收请求与响应请求 : 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
    */
    
    //===============================以下代码为test.js文件中内容==========================================
    
    //步骤一、引入 required 模块,使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http
    var http = require('http');
    
    // 步骤二、创建服务器
    // 使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request,response 参数来接收和响应数据。
    http.createServer(function(request, response) {
        
        // 发送 HTTP 头部
        // HTTP 状态值: 200 : OK
        // 内容类型: text/plain
        response.writeHead(200, {
            'Content-Type' : 'text/plain'
        });
        
        
        // 发送响应数据 "Hello World"
        response.end('Hello World 哈哈哈哈
    ');
    
    }).listen(8888);
    
    // 执行该js文件后终端(这里是cmd命令行)打印的信息
    console.log('Server running at http://127.0.0.1:8888/');
    
    //===============================以上代码为test.js文件中内容==========================================
    
    /*
    编码文件保存在 D:ApacheServerweb	est	est.js
    在cmd中切换到编码目录下
    d:
    cd ApacheServer/web/test
    
    执行test.js文件
    node test.js
    此时可以在浏览器中打开页面,期间不能关闭cmd命令行,否则执行文件终止,浏览器不能访问
    http://127.0.0.1:8888/
    */
    
    
    
    
    
    /*
    =========================Node.js 回调函数
    Node.js 异步编程的直接体现就是回调。
    异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
    回调函数在完成任务后就会被调用
    Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。
    例如,可以一边读取文件,一边执行其他命令,在文件读取完成后,将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
    以下代码示例同步及异步+回调方法的不同
    */
    
    
    //创建一个文件 input.txt ,内容:这是一段测试内容
    
    //===============================以下代码为main.js文件中内容==========================================
    //首先是阻塞代码实例(同步顺序执行)
    var fs = require("fs");
    
    var data = fs.readFileSync('input.txt');
    
    console.log(data.toString());
    console.log("程序执行结束!");
    //===============================以上代码为main.js文件中内容==========================================
    /*
    执行main.js
    node main.js
    输出内容:
    这是一段测试内容
    程序执行结束!
    */
    
    //===============================以下代码为main.js文件中内容==========================================
    //非阻塞代码实例(异步+回调执行)
    var fs = require("fs");
    
    //readFile方法的第二个参数就是回调函数,先读取input.txt文件,读取完后调用后面的方法并传参
    fs.readFile('input.txt', function (err, data) {
        if (err){
            return console.error(err);
        }
        console.log(data.toString());
    });
    
    console.log("程序执行结束!");
    //===============================以上代码为main.js文件中内容==========================================
    /*
    执行main.js
    node main.js
    输出内容:
    程序执行结束!
    这是一段测试内容
    
    
    以上两个实例显示阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行下面代码。 第二个实例不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
    因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,就需要写在回调函数内。
    */
    
    
    
    
    
    //=========================Node.js 事件及事件循环
    /*
    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
    Node.js 的每一个 API(预定义函数) 都是异步的,并作为一个独立线程运行,使用异步函数调用,处理并发。
    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者后退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
    
    
    事件驱动程序
    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
    当这个请求完成,它被放回处理队列,当该请求排序到队列开头,这个结果被返回给用户。
    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
    
    
    Node.js 有多个内置的事件,可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,并且events 模块只提供了一个类对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
    步骤如下:
    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    // 绑定事件及事件的监听处理程序,eventName为自定义事件名,eventHandler1及eventHandler2变量各代表一个自定义函数,这里表示eventName事件的一个监听程序,同一个事件可以绑定多个监听程序,当触发事件时,绑定的所有监听程序将依次执行
    下面实例有具体应用
    eventEmitter.on('eventName', eventHandler1);
    eventEmitter.on('eventName', eventHandler2);
    // 触发事件
    eventEmitter.emit('eventName');
    //这时eventName事件绑定的eventHandler1,eventHandler2两个监听函数都将执行
    
    
    EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
    EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。
    Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
    */
    
    //实例
    //===============================以下代码为main.js文件中内容==========================================
    //引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    //以上两句也可改写成
    /*
    var EventEmitter = require('events').EventEmitter;
    var eventEmitter = new EventEmitter();
    */
    
    // 创建事件处理程序
    var connectHandler = function connected() {
        console.log('连接成功。');
    
        // 触发 data_received 事件
        eventEmitter.emit('data_received', 'arg1 参数', 'arg2 参数');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
    
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(arg1, arg2) {
        console.log('数据接收成功。'+arg1+arg2);
    });
    
    // 触发 connection 事件
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");
    
    //===============================以上代码为main.js文件中内容==========================================
    /*
    执行main.js
    node main.js
    输出内容:
    连接成功。
    数据接收成功。arg1 参数arg2 参数
    程序执行完毕。
    */
    
    
    //更多EventEmitter对象例子
    //实例
    //===============================以下代码为main.js文件中内容==========================================
    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 执行。');
    }
    
    //监听器 #3
    var listener3 = function listener3() {
        console.log('监听器 listener3 执行。');
    }
    
    // addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。
    // 绑定 connection 事件,处理函数为 listener1
    eventEmitter.addListener('connection', listener1);
    
    // on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
    // eventEmitter.on()与eventEmitter.addListener()没有区别,且一个事件可以绑定多个回调函数。
    // 绑定 connection 事件,处理函数为 listener2
    eventEmitter.on('connection', listener2);
    
    // once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
    //绑定 connection 事件,处理函数为 listener3
    eventEmitter.once('connection', listener3);
    
    //获取connection事件绑定了几个监听器
    var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter, 'connection');
    console.log(eventListeners + " 个监听器监听连接事件。");
    
    var eventListenerArr = eventEmitter.listeners('connection');
    console.log(eventListenerArr);
    
    // 处理 connection 事件
    eventEmitter.emit('connection');
    
    // removeListener(event, listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。它接受两个参数,第一个是事件名称,第二个是回调函数名称。
    // removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器(这里的中括号[]表示可有可无,不是数组)。
    // 移除监绑定的 listener1 函数
    eventEmitter.removeListener('connection', listener1);
    console.log("listener1 不再受监听。");
    
    // 触发连接事件
    eventEmitter.emit('connection');
    
    eventListeners = require('events').EventEmitter.listenerCount(eventEmitter, 'connection');
    console.log(eventListeners + " 个监听器监听连接事件。");
    
    console.log("程序执行完毕。");
    
    
    // EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
    // eventEmitter.emit('error');
    
    //===============================以上代码为main.js文件中内容==========================================
    /*
    执行main.js
    node main.js
    输出内容:
    3 个监听器监听连接事件。
    [ [Function: listener1],
      [Function: listener2],
      [Function: listener3] ]
    监听器 listener1 执行。
    监听器 listener2 执行。
    监听器 listener3 执行。
    listener1 不再受监听。
    监听器 listener2 执行。
    1 个监听器监听连接事件。
    程序执行完毕。
    */
  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/dreamhome/p/8463449.html
Copyright © 2011-2022 走看看