Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点js事件侦听器未按预期工作_Javascript_Node.js_Typescript_Events_Event Listener - Fatal编程技术网

Javascript 节点js事件侦听器未按预期工作

Javascript 节点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

因此,我基本上是在尝试在不同的typescript类上发出并侦听特定事件。发出的第一个事件在另一个类上被正确地侦听,但是,例如,一旦我设置了在10秒后发出其他事件的超时,监听器就好像不再侦听了

commonEmitter.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();

}
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-这就是为什么它使用胖箭头函数进行回调<代码>此来自词汇上下文,而不是发射器。