【问题标题】:What is an "event emitter"?什么是“事件发射器”?
【发布时间】:2012-11-18 09:24:32
【问题描述】:

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

有人愿意给我解惑吗?听起来很有趣……

【问题讨论】:

标签: javascript events event-handling dom-events


【解决方案1】:

它会触发一个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");

【讨论】:

  • 你的最后一段是错误的,jQuery 确实 支持自定义事件和声明。示例:jsfiddle.net/PzRtn
  • @RobW 感谢您的更正。然而,jQuery 的局限性在于它需要一个 jQuery/DOM 对象才能发出事件。对吗?
  • 我已经确定了答案。如果您仍然看到任何问题,请告诉我。谢谢。
  • jQuery 可以在没有 DOM 元素的情况下执行事件,使用 $({})
【解决方案2】:

在 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?

【讨论】:

  • 对这篇文章的很好的解释,最初对我来说完全没有意义
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    考虑一个回调函数-

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多