浏览器端是否有任何EventEmitter在nodejs中具有类似的逻辑?

Xin*_*Xin 17 javascript browser

在node.js中使用eventEmitter非常容易:

var e = new EventEmitter();
e.on('happy', function(){console.log('good')});
e.emit('happy');
Run Code Online (Sandbox Code Playgroud)

浏览器原生的任何客户端EventEmitter?

Bra*_*rad 25

在现代浏览器中,存在EventTarget。

class MyClass extends EventTarget {
  doSomething() {
    this.dispatchEvent(new Event('something'));
  }
}

const instance = new MyClass();
instance.addEventListener('something', (e) => {
  console.log('Instance fired "something".', e);
});
instance.doSomething();
Run Code Online (Sandbox Code Playgroud)

其他资源:


Xin*_*Xin 6

在客户端创建自定义事件,并附加到 dom 元素:

var event = new Event('build');

// Listen for the event.
elem.addEventListener('build', function (e) { /* ... */ }, false);

// Dispatch the event.
elem.dispatchEvent(event);
Run Code Online (Sandbox Code Playgroud)

这是参考自:https : //developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events 谢谢 Naeem Shaikh

  • 这只适用于 HTML 元素,问题是如何让它像在 Node 中一样适用于对象。 (6认同)

Ami*_*rji 6

有一个名为“events”的 NPM 包,它使您能够在浏览器环境中制作事件发射器。

var EventEmitter = require('events')
 
var e = new EventEmitter()
e.on('message', function (text) {
  console.log(text)
})
e.emit('message', 'hello world')
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它是

var EventEmitter = require('events')

var e = new EventEmitter();
e.on('happy', function(){console.log('good')});
e.emit('happy');
Run Code Online (Sandbox Code Playgroud)

  • @Ivan SO 答案不仅仅适用于OP。这就是我一直在寻找的答案,看看投票,其他人也是如此。我希望相同的代码可以在两种环境中工作。 (15认同)
  • OP 正在寻找在不需要 npm 包的浏览器上进行本机实现的工作。 (7认同)
  • @vighnesh153我认为用***非常微小的方式***不同的问题淹没SO会增加噪音。最好在一个问题下收集解决问题症结的多种解决方案。更不用说问题的措辞,人们在搜索结果中看到的内容,“是否有 EventEmitter”而不是“浏览器中是否有类似节点的 EventEmitter 的东西”,如果有什么使这成为更有效的答案的话。不知道你为什么挑剔。 (2认同)

Alp*_*lan 5

这对于给定的情况就足够了。

class EventEmitter{
    constructor(){
        this.callbacks = {}
    }

    on(event, cb){
        if(!this.callbacks[event]) this.callbacks[event] = [];
        this.callbacks[event].push(cb)
    }

    emit(event, data){
        let cbs = this.callbacks[event]
        if(cbs){
            cbs.forEach(cb => cb(data))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:我刚刚发布了它的更进化版本。这很简单,但可能已经足够了:https : //www.npmjs.com/package/alpeventemitter

  • 当事件处理程序发出另一个事件时,这将导致事件处理无序。您可能想在emit返回后使用setTimeout调用emit中的回调。或者将事件放入队列中。 (4认同)

Jia*_*ong -3

你需要一个 JavaScript 库,比如https://github.com/Olical/EventEmitter \xef\xbc\x9f

\n

  • 不完全是,我想要一些原生的,而不是第三方库。谢谢。 (4认同)