zoukankan      html  css  js  c++  java
  • NodeJs事件驱动

    today, 我们的话题作文是nodejs,我尝试对它的描述是:似曾相似,但它又不一样的存在着。百花齐放的it世界里,以独特身姿绽放的美丽更容易吸引人。也许只是不了解,也许时间会给出答案,nodejs你值得拥有。

    本篇了解一下nodejs的事件驱动。

    Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

    事件发射器:EventEmitter

    通过 require('events').EventEmitter 获取 EventEmitter 类。

    通过一个列子来看一下EventEmitter类中事件发送以及事件监听的功能封装。

    创建events.js文件:

    var EventEmitter=require("events").EventEmitter;
    var events=new EventEmitter();
    events.on("Click",function(){
        console.log("This Click Event");
    });

    setTimeout(function(){
        events.emit("Click");
    },1000);

    执行脚本:
    E:NodeJS>node events.js
    This Click Event

    emitter.on(event, listener)

    添加一个监听者到特定 event 的监听数组的尾部,触发器不会检查是否已经添加过这个监听者。 多次调用相同的 event listener 将会导致 listener 添加多次。

    比如说往events.js中编写如下内容:

    var EventEmitter=require("events").EventEmitter;
    var events=new EventEmitter();
    events.on("Click",function(){
        console.log("This Click Event 1");
    });
    events.on("Click",function(){
        console.log("This Click Event 2");
    });

    setTimeout(function(){
        events.emit("Click");
    },1000);

    执行脚本:

    E:NodeJS>node events.js
    This Click Event 1
    This Click Event 2
    事件都会被监听,而且会依次执行。

    emitter.addListener(event, listener)或者emitter.once(event, listener)

    给事件添加一个一次性的 listener,这个 listener 只会被触发一次,之后就会被移除。没有监听的事件将一直处于等待状态。

    比如说往events.js中编写如下内容:

    var EventEmitter=require("events").EventEmitter;
    var events=new EventEmitter();
    events.once("Click1",function(){
        console.log("This Click Event 1");
    });
    events.on("Click2",function(){
        console.log("This Click Event 2");
    });
    setInterval(function(){
        events.emit("Click1");
    },1000);
    setInterval(function(){
        events.emit("Click2");
    },1000);

    执行脚本:

    E:NodeJS>node events.js
    This Click Event 1
    This Click Event 2
    This Click Event 2
    once注册的事件只会被监听一次,其后将不会被触发。

    emitter.removeListener(event, listener)

    从一个某个事件的 listener 数组中移除一个 listener。

    比如说往events.js中编写如下内容:

    var EventEmitter=require("events").EventEmitter;
    var events=new EventEmitter();
    var callback1=function(){
        console.log("This Click Event 1");
    }
    var callback2=function(){
        console.log("This Click Event 2");
    }
    events.on("Click",callback1);
    events.on("Click",callback2);
    events.removeListener("Click",callback2);

    setTimeout(function(){
        events.emit("Click");
    },1000);

    执行脚本:

    E:NodeJS>node events.js
    This Click Event 1
    被移出监听的事件其后将不会被触发。removeListener 最多会移除数组里的一个 listener。如果多次添加同一个 listener 到数组,那就需要多次调用removeListener 来移除每一个实例。

    emitter.removeAllListeners([event])

    移出所有监听事件。

    emitter.setMaxListeners(n)

    设置每个监听事件的最大个数。

    EventEmitter.defaultMaxListeners

    设置每个监听事件的默认个数。

    emitter.listeners(event)

    返回事件的 listener 数组。

    emitter.emit(event[, arg1][, arg2][, ...])

    使用指定的参数顺序的执行每一个 listener.

    如果事件有 listener,返回 true, 否则 false

  • 相关阅读:
    2021昆明站K-Riichi!!(麻将)
    数据结构 Week 3 --- dsu on tree 和 点分治
    数据结构 Week 2 --- 平衡树
    数据结构 Week 1 --- 从线段树到主席树
    一些思维题(三)
    一些思维题(二)
    2021ICPC昆明站总结及补题
    2021ICPC昆明M题 非主席树做法
    2020ICPC昆明参赛
    记5.28leetcode简单题
  • 原文地址:https://www.cnblogs.com/Francis-YZR/p/5275916.html
Copyright © 2011-2022 走看看