>  기사  >  웹 프론트엔드  >  Node.js의 이벤트에 대한 자세한 설명

Node.js의 이벤트에 대한 자세한 설명

青灯夜游
青灯夜游앞으로
2020-12-01 17:34:013032검색

Node.js의 이벤트에 대한 자세한 설명

관련 권장 사항: "nodejs Tutorial"

프론트 엔드는 확실히 이벤트에 익숙합니다. 이는 스크롤 이벤트를 windows

window.addEventListener('scroll', ev => {
	console.log(ev);
});

Node.js에 바인딩합니다. 대부분의 비동기 작업은 이벤트 중심이며 모든 개체는 EventEmitter 클래스
EventEmitter 类

事件监听

on

Node.js 事件监听使用和 jQuery API 非常类似emitter.on(eventName, listener)

const ee = new EventEmitter();
ee.on('foo', () => console.log('a'));
  1. EventEmitter 实例会维护一个 listener 数组,每次 listener 默认会被添加到数组尾部
  2. 每次添加 listener 不会检查是否添加过,多次调用 on 传入相同的 eventName 和 listener,会导致 listener 被添加多次

prependListener

emitter.prependListener(eventName, listener) 
通过 prependListener 可以把 listener 添加到 listener 数组头部

const ee = new EventEmitter();
ee.prependListener('foo', () => console.log('a'));

once

如果希望 listener 被触发一次后就不再触发,可以使用 once 来绑定事件

const ee = new EventEmitter();
ee.once('foo', () => console.log('a'));

事件触发

emitter.emit(eventName[, ...args])
在浏览器环境中开发者事件相关的大部分工作是订阅事件,也就是绑定事件处理函数 listener,在 Node.js 事件编程中经常需要创建事件对象,在合理实际触发事件。使用 emit 方法可以按照 listener 注册的顺序,同步地调用每个注册到名为 eventName 的事件的监听器,并传入提供的参数

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// 第一个监听器。
myEmitter.on('event', function firstListener() {
  console.log('第一个监听器');
});
// 第二个监听器。
myEmitter.on('event', function secondListener(arg1, arg2) {
  console.log(`第二个监听器中的事件有参数 ${arg1}、${arg2}`);
});
// 第三个监听器
myEmitter.on('event', function thirdListener(...args) {
  const parameters = args.join(', ');
  console.log(`第三个监听器中的事件有参数 ${parameters}`);
});

console.log(myEmitter.listeners('event'));

myEmitter.emit('event', 1, 2, 3, 4, 5);

// Prints:
// [
//   [Function: firstListener],
//   [Function: secondListener],
//   [Function: thirdListener]
// ]
// 第一个监听器
// 第二个监听器中的事件有参数 1、2
// 第三个监听器中的事件有参数 1, 2, 3, 4, 5

this 指向

eventEmitter.emit() 方法可以传任意数量的参数到 listener, this 关键词会被指向 listener 所绑定的 EventEmitter 实例

const myEmitter = new MyEmitter();
myEmitter.on('event', function(a, b) {
  console.log(a, b, this, this === myEmitter);
  // 打印:
  //   a b MyEmitter {
  //     domain: null,
  //     _events: { event: [Function] },
  //     _eventsCount: 1,
  //     _maxListeners: undefined } true
});
myEmitter.emit('event', 'a', 'b');

也可以使用 ES6 的箭头函数作为监听器。但 this 关键词不会指向 EventEmitter 实例:

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
  console.log(a, b, this);
  // 打印: a b {}
});
myEmitter.emit('event', 'a', 'b');

异步调用

EventEmitter 以注册的顺序同步地调用所有 listener,这样可以确保事件的正确排序,listener 可以使用 setImmediate()process.nextTick() 方法切换到异步的操作模式

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
  setImmediate(() => {
    console.log('异步地发生');
  });
});
myEmitter.emit('event', 'a', 'b');

事件卸载

Node.js 提供了几种卸载事件绑定的方法

off/removeListener

off 方法是 removeListener 方法的别名,用于清理事件绑定 emitter.removeListener(eventName, listener)

const callback = (stream) => {
  console.log('已连接');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

removeListener() 最多只会从监听器数组中移除一个监听器。 如果监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener() 才能移除所有实例

removeAllListeners

emitter.removeAllListeners([eventName]) 
移除指定的 eventName 事件的 listener,如果没有指定 eventName,则移除事件对象的所有 listener。可以通过 emitter.eventNames()

이벤트 수신

on

Node를 상속하여 이벤트를 트리거할 수 있습니다. Node.js 이벤트 수신이 사용됩니다. jQuery API emitter.on(eventName, Listener)

const EventEmitter = require('events');
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});

myEE.eventNames().forEach(eventName => myEE.removeAllListeners);
  1. 와 매우 유사합니다. EventEmitter 인스턴스는 리스너 배열을 유지하고 각 리스너는 끝에 추가됩니다. 기본적으로 배열의 배열
  2. 리스너가 추가될 때마다 이전에 추가되었는지 여부를 확인하지 않고 동일한 eventName과 리스너를 전달하면 리스너가 추가됩니다. 여러 번

prependListener

emitter.prependListener(eventName, Listener)
prependListener 사용, 리스너 배열의 헤드에 리스너를 추가할 수 있습니다
rrreee

한 번

리스너가 한 번 트리거되고 더 이상 트리거되지 않도록 하려면 한 번을 사용하여 바인딩할 수 있습니다. event🎜rrreee

이벤트 트리거

🎜emitter.emit(eventName [, ...args])
대부분의 개발자 이벤트 관련 브라우저 환경에서의 작업은 이벤트를 구독하는 것, 즉 이벤트 처리 함수 리스너를 바인딩하는 것입니다. 이는 Node.js 이벤트 프로그래밍에서 종종 수행됩니다. 실제로 이벤트를 합리적으로 트리거하려면 이벤트 객체를 생성해야 합니다. 내보내기 메소드를 사용하여 리스너가 등록된 순서대로 eventName이라는 이벤트에 등록된 각 리스너를 동기적으로 호출하고 제공된 매개변수🎜rrreee

를 전달합니다. this는

🎜eventEmitter.emit() 메소드를 가리켜 리스너에게 여러 매개변수를 전달할 수 있습니다. this 키워드는 다음에 의해 바인딩된 EventEmitter 인스턴스를 가리킵니다. 🎜rrreee🎜ES6 화살표 기능을 리스너로 사용할 수도 있습니다. 그러나 this 키워드는 EventEmitter 인스턴스를 가리키지 않습니다. 🎜rrreee

비동기 호출

🎜EventEmitter는 등록된 순서 모든 리스너는 이벤트의 올바른 순서를 보장할 수 있습니다. 리스너는 setImmediate()process.nextTick() 메서드를 사용하여 비동기 작업 모드로 전환할 수 있습니다🎜 rrreee

이벤트 언로드

🎜Node.js는 이벤트 바인딩을 제거하는 여러 가지 방법을 제공합니다.
🎜

off/removeListener

🎜off 방법 이벤트 바인딩 emitter.removeListener(eventName, Listener)🎜rrreee🎜removeListener()를 정리하는 데 사용되는 메소드의 제거리스너 별칭은 리스너 배열에서 최대 하나의 리스너만 제거합니다. 지정된 eventName에 대한 리스너 배열에 리스너가 여러 번 추가된 경우 모든 인스턴스를 제거하려면 RemoveListener()를 여러 번 호출해야 합니다.
🎜

removeAllListeners

🎜 Emitter.removeAllListeners([eventName])
지정된 eventName 이벤트의 리스너를 제거합니다. eventName이 지정되지 않은 경우 이벤트 객체의 모든 리스너를 제거합니다. emitter.eventNames()를 통해 이벤트 개체의 eventName 배열을 얻을 수 있습니다.🎜rrreee🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜

위 내용은 Node.js의 이벤트에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제