什么是“事件发射器”?

浏览 http://microjs.com时,我看到许多标有“事件发射器”的库。我喜欢认为自己对 Javascript 语言的基本知识了如指掌,但是我真的不知道“事件发射器”是什么或者做什么。

有人能告诉我吗? 听起来很有趣..。

68612 次浏览

在 node.js 中,事件可以简单地描述为带有相应回调的字符串。一个事件可以“发出”(或者换句话说,相应的回调被调用)多次,或者您可以选择只侦听第一次发出的事件。

例子:-

var example_emitter = new (require('events').EventEmitter);
example_emitter.on("test", function () { console.log("test"); });
example_emitter.on("print", function (message) { console.log(message); });
example_emitter.emit("test");
example_emitter.emit("print", "message");
example_emitter.emit("unhandled");


> var example_emitter = new (require('events').EventEmitter);
{}
> example_emitter.on("test", function () { console.log("test"); });
{ _events: { test: [Function] } }
> example_emitter.on("print", function (message) { console.log(message); });
{ _events: { test: [Function], print: [Function] } }
> example_emitter.emit("test");
test //console.log'd
true //return value
> example_emitter.emit("print", "message");
message //console.log'd
true    //return value
> example_emitter.emit("unhandled");
false   //return value

这演示了 EventEmitter的所有基本功能。on or addListener方法(基本上是订阅方法)允许您选择要监视的事件和要调用的回调。另一方面,emit方法(发布方法)允许您“发出”一个事件,这会导致注册到该事件的所有回调“触发”(被调用)。

来源 什么是事件发生器?

它会触发任何人都能听到的 事件。不同的库为不同的目的提供不同的实现,但其基本思想是提供发布事件和订阅事件的框架。

来自 jQuery 的例子:

// Subscribe to event.
$('#foo').bind('click', function() {
alert("Click!");
});


// Emit event.
$('#foo').trigger('click');

但是,使用 jQuery 发出事件需要有一个 DOM 对象,而且不能从任意对象发出事件。这就是事件发射器变得有用的地方。下面是一些演示自定义事件的伪代码(与上面完全相同的模式) :

// Create custom object which "inherits" from emitter. Keyword "extend" is just a pseudo-code.
var myCustomObject = {};
extend(myCustomObject , EventEmitter);


// Subscribe to event.
myCustomObject.on("somethingHappened", function() {
alert("something happened!");
});


// Emit event.
myCustomObject.emit("somethingHappened");

考虑一个回调函数-

function test(int a, function(){
console.log("I am call-back function");
}){
console.log("I am a parent function");
}

现在,每当对事件(单击按钮或任何连接等)调用父函数时,它首先执行其代码,然后将控制传递给回调函数。现在,事件发射器是一个对象/方法,它在某个操作发生时立即触发一个事件,以便将控制传递给父函数。 例如-Server 是 Node.Js 编程中的事件发射器。一旦服务器遇到错误,它就会发出错误事件,将控件传递给错误父函数。只要一个套接字连接到服务器,服务器就会发出一个连接事件,然后这个事件就会触发 getConnections 的父函数,这个函数实际上也接受一个回调函数作为参数。因此,它确实是一个链,当事件发射器发生某些事情时触发,事件发射器发出一个事件来启动正在运行的函数。

在 Node.js 中有一个简单的例子:

var EventEmitter = require('events').EventEmitter;
var concert = new EventEmitter;
var singer = 'Coldplay';


concert.on('start', function (singer) {
console.log(`OMG ${singer}!`);
});


concert.on('finish', function () {
console.log(`It was the best concert in my life...`);
});


concert.emit('start', singer);
concert.emit('finish');