【问题标题】:Use EventEmitter in ES6 class在 ES6 类中使用 EventEmitter
【发布时间】:2016-11-11 20:38:32
【问题描述】:

我正在尝试让我自己的类中的 EventEmitter 在 ES6 中运行:

"use strict";
const EventEmitter = require('events');

class Client extends EventEmitter{

    constructor(token, client_id, client_secret, redirect_uri, code){
        super();
        this.token = token;
        this.client_id = client_id;
        this.client_secret = client_secret;
        this.redirect_uri = redirect_uri;
        this.code = code;
    }

    eventTest(){
        this.emit("event");
        console.log(this.token);
    }
}

let testClient = new Client(1,2,3,4,5);

testClient.eventTest();
testClient.on('event', () => {console.log('triggerd!')} );

但事件没有做任何事情^^

如果没有 ES6,我可以使用以下代码:

var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Client = function(credentials) {
    var self = this;

    function eventTest() {
        self.emit('event');
    }
};

util.inherits(Client, EventEmitter);

有人知道如何在 ES6 中正确地做到这一点吗?

【问题讨论】:

  • 不应该是const EventEmitter = require('events').EventEmitter;吗?
  • @nem035 我已经找到了收藏,但我不明白如何制作活动。这些例子只是展示了如何在一个类中创建一个函数:/

标签: javascript node.js inheritance ecmascript-6 eventemitter


【解决方案1】:

事件是同步的——你在听之前触发它。使用

const testClient = new Client(1,2,3,4,5);
testClient.on('event', () => {console.log('triggered!')} );
testClient.eventTest();

【讨论】:

  • 非常感谢!这是一个愚蠢的错误。
  • @Alaska 事件的发生通常是不确定的,因此是异步的,除非您的代码自己发出它们。所以我不会称之为愚蠢的错误:D
  • bergi 的回答有效。只是想补充一点,将 EventEmitter 用于同步代码可以被认为是一种反模式。 EventEmitter 的本质在于它处理异步事件的能力。就像提到的 user3674318 一样,考虑使您的方法异步,以便抽象的用户可以按预期使用它。 [Node.js 设计模式第 3 章][1] 是了解观察者模式的绝佳资源。 [1]:nodejsdesignpatterns.com
【解决方案2】:

您可以使用process.nextTick() 使您的代码异步。之后一切都会按预期工作。这是节点文档中的注释:

process.nextTick() 方法将回调添加到“下一个滴答队列”。一旦事件循环的当前轮次运行完成,当前在下一个滴答队列中的所有回调都会被调用。

eventTest(){
    process.nextTick(() => {
        this.emit("event");
    });
    console.log(this.token);
}

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2016-08-14
    • 2016-07-15
    • 1970-01-01
    • 2017-04-26
    • 2019-02-06
    • 2019-09-20
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多