gpt4 book ai didi

JavaScript 回调或观察者

转载 作者:行者123 更新时间:2023-11-28 14:48:19 25 4
gpt4 key购买 nike

这是一个关于 javascript 的一般问题。我想要实现但我不知道是否可能的是以下内容。

我想编写一个包含对象的 JavaScript 库。因此,通过使用这个 javascript 库,我想通过执行以下操作来实例化另一个 javascript 文件中的对象:

myObject = new myObject();

我通过在我的 javascript 库中编写一个函数来实现这一点:

function myObject() {
//init object logic
}

问题是,现在我希望能够从我之前实例化对象的 javascript 文件中监听该对象的不同事件。像这样:

myObject = new myObject();

myObject.on('connection', function(conn) {
conn.on('data', function(data){

console.log("conn on data");

});

conn.on('error', function(data){

console.log("conn on error");

});

});

如何在 JavaScript 中实现此目的?我正在考虑回调,但我不知道方法。

最佳答案

您正在寻找一个可以通过以下方式实现的 EventEmitter:

class EventEmitter  {
constructor () {
this.events = {};
}
on (channel, cb) {
if (Array.isArray(this.events[channel])) {
this.events[channel].push(cb);
} else {
this.events[channel] = [cb];
}
}
emit (channel, ...args) {
if (Array.isArray(this.events[channel])) {
this.events[channel].forEach(cb => cb.apply(null, args));
}
}
}

您的类可以继承自EventEmitter:

class MyClass extends EventEmitter {
constructor () {
super();
// do initialization
}
}

现在,您可以实例化您的类:

var myObject = new MyClass();
myObject.on('event', function (a, b) {
console.log('Event A was emitted: ', a + b);
});
myObject.emit('event', 123, 456); // "Event A was emitted: 579"

工作示例:

class EventEmitter  {
constructor () {
this.events = {};
}
on (channel, cb) {
if (Array.isArray(this.events[channel])) {
this.events[channel].push(cb);
} else {
this.events[channel] = [cb];
}
}
emit (channel, ...args) {
if (Array.isArray(this.events[channel])) {
this.events[channel].forEach(cb => cb.apply(null, args));
}
}
}

class MyClass extends EventEmitter {
constructor () {
super();
// do initialization
}
}

var myObject = new MyClass();
myObject.on('event', function (a, b) {
console.log('Event A was emitted: ', a + b);
});
myObject.emit('event', 123, 456); // "Event A was emitted: 579"

请注意,我使用了一些新功能,例如扩展运算符 (...) 和新的 class 语法。当然,您也可以使用旧的functionprototype方式实现相同的效果。

在您的代码中,有一行

myObject = new myObject();

不要那样做。您将新实例分配给包含构造函数的变量,从而失去对该构造函数的访问权限。

NodeJS 有自己的 EventEmitter 类。您可以使用以下方式访问它:

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

关于JavaScript 回调或观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com