Javascript 节点js事件侦听器未按预期工作
因此,我基本上是在尝试在不同的typescript类上发出并侦听特定事件。发出的第一个事件在另一个类上被正确地侦听,但是,例如,一旦我设置了在10秒后发出其他事件的超时,监听器就好像不再侦听了 commonEmitter.tsJavascript 节点js事件侦听器未按预期工作,javascript,node.js,typescript,events,event-listener,Javascript,Node.js,Typescript,Events,Event Listener,因此,我基本上是在尝试在不同的typescript类上发出并侦听特定事件。发出的第一个事件在另一个类上被正确地侦听,但是,例如,一旦我设置了在10秒后发出其他事件的超时,监听器就好像不再侦听了 commonEmitter.ts let events = require('events'); let em = new events.EventEmitter(); module.exports.commonEmitter = em; export class Network { constr
let events = require('events');
let em = new events.EventEmitter();
module.exports.commonEmitter = em;
export class Network {
constructor() {
this.setConnection('connected');
setTimeout(() => {
commonEmitter.emit('connectionStatusChanged');
connection = 'disconnected';
}, 10000);
}
private setConnection(newConnection): void {
connection = newConnection
commonEmitter.emit('connectionStatusChanged');
}
public isConnected(): boolean {
return connection === 'connected';
}
}
export let connection = null;
export class View {
private network: any;
constructor() { }
private test(){
console.log('Online? ' + this.network.isConnected());
}
public init(){
commonEmitter.on('connectionStatusChanged', this.test());
this.network = new Network();
}
network.ts
let events = require('events');
let em = new events.EventEmitter();
module.exports.commonEmitter = em;
export class Network {
constructor() {
this.setConnection('connected');
setTimeout(() => {
commonEmitter.emit('connectionStatusChanged');
connection = 'disconnected';
}, 10000);
}
private setConnection(newConnection): void {
connection = newConnection
commonEmitter.emit('connectionStatusChanged');
}
public isConnected(): boolean {
return connection === 'connected';
}
}
export let connection = null;
export class View {
private network: any;
constructor() { }
private test(){
console.log('Online? ' + this.network.isConnected());
}
public init(){
commonEmitter.on('connectionStatusChanged', this.test());
this.network = new Network();
}
view.ts
let events = require('events');
let em = new events.EventEmitter();
module.exports.commonEmitter = em;
export class Network {
constructor() {
this.setConnection('connected');
setTimeout(() => {
commonEmitter.emit('connectionStatusChanged');
connection = 'disconnected';
}, 10000);
}
private setConnection(newConnection): void {
connection = newConnection
commonEmitter.emit('connectionStatusChanged');
}
public isConnected(): boolean {
return connection === 'connected';
}
}
export let connection = null;
export class View {
private network: any;
constructor() { }
private test(){
console.log('Online? ' + this.network.isConnected());
}
public init(){
commonEmitter.on('connectionStatusChanged', this.test());
this.network = new Network();
}
最后,两个事件都被发出,但只有第一个事件被“监听”。
原因是什么?我如何以有序的方式完成它?在这行代码中:
commonEmitter.on('connectionStatusChanged', this.test());
您正在立即调用this.test(),而不是传递稍后可以调用的函数引用。将其更改为:
commonEmitter.on('connectionStatusChanged', this.test.bind(this));
因此,您正在正确地传递一个函数引用,该函数引用也将正确地绑定到this
或者,您可以使用胖箭头回调函数来保留
this
的词法值,如下所示:
commonEmitter.on('connectionStatusChanged', () => {
this.test();
});
箭头函数与测试函数调用结合在一起对我很有效,所以非常感谢@jfriend000:p带有bind方法的函数不起作用,但它还可以 我还有一个问题,每次我尝试发出带有任何类型的参数的事件时,侦听器都不会听到。例如:
// view.ts
commonEmitter.on('connectionStatusChanged', (data: boolean) => {
console.log(data);
});
// network.ts
commonEmitter.emit('connectionStatusChanged', true);
如果这也与上下文相关,那么应该如何做呢?要回答第二个问题,应该将对象作为参数传递给emit
// network.ts
commonEmitter.emit('connectionStatusChanged', {data: true});
通过使用此解决方案,现在不会侦听网络类发出的第一个事件。。只有在超时后,它才能工作并刷新视图,但我不知道为什么第一个不能:/ //网络技术
commonEmitter.emit('connectionStatusChanged', {isOnline: true});
//view.ts
commonEmitter.on('connectionStatusChanged', (data: any) => {
console.log('Online? ' + data.isOnline);
});
我对括号函数不是很确定,但在某些情况下,如果不绑定事件(例如原型事件),事件中使用的某些实例中不会存在“this”。。。commonEmitter.on('connectionStatusChanged',()=>{this.test();}).bind(this);好吧,我没看见你是文盲it@JonoJames-这就是为什么它使用胖箭头函数进行回调<代码>此来自词汇上下文,而不是发射器。