什么是“事件发射器”?

时间:2012-11-18 09:24:33

标签: javascript events javascript-events event-handling

浏览http://microjs.com,我看到许多标记为“事件发射器”的库。我喜欢认为我非常了解javascript语言的基础知识,但我真的不知道“事件发射器”是什么或者是什么。

有人关心开导我吗?听起来很有趣......

4 个答案:

答案 0 :(得分:54)

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

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

答案 1 :(得分:20)

  

在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方法(发布方法)允许您“发出”一个事件,这会导致注册到事件的所有回调都“触发”(被调用)。

来自来源What are Event Emitters?

答案 2 :(得分: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');

答案 3 :(得分:1)

考虑一个回叫函数 -

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

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