什么是“事件发射器”?


76

通过http://microjs.com浏览,我看到了很多标有“事件发射器”的库。我想认为我非常了解Javascript语言的基础知识,但是我真的不知道“事件发射器”是什么还是做什么。

有人愿意启发我吗?听起来很有趣...

Answers:


60

它触发任何人都可以收听的事件。不同的库提供不同的实现方式和目的,但基本思想是提供一个用于发布事件和订阅事件的框架。

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");

12
您的最后一段是错误的,jQuery确实支持自定义事件和声明。示例:jsfiddle.net/PzRtn
Rob W

@RobW谢谢您的纠正。但是,jQuery的局限性在于它需要一个jQuery / DOM对象才能发出事件。那是对的吗?
niaher 2012年

我已经解决了答案。如果您仍然看到任何问题,请告诉我。谢谢。
niaher 2012年

4
jQuery的可以做的事件,而DOM元素,使用$ {}
杰克


21

在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另一方面,该方法(发布方法)使您可以“发射”一个事件,该事件使注册到该事件的所有回调均“触发”(被调用)。

从源头 上看,什么是事件发射器?


这篇文章的好解释本来对我来说根本没有什么意义
Vass

4

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');

1

考虑回调函数-

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.