Node js прослушиватель событий не работает должным образом - PullRequest
1 голос
/ 26 января 2020

Так что я в основном пытаюсь излучать и прослушивать указанное c событие в разных классах машинописи. Первое излучаемое событие правильно прослушивается в другом классе, но как только я установил тайм-аут, например, для выдачи другого события через 10 секунд, он как слушатель больше не слушает ..

commonEmitter .ts

let events = require('events');
let em = new events.EventEmitter();
module.exports.commonEmitter = em;

network.ts

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;

view.ts

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

}

В конце оба события испускаются, но только первое прослушивается. В чем причина этого и как я могу это сделать упорядоченным образом?

Ответы [ 4 ]

1 голос
/ 26 января 2020

Чтобы ответить на второй вопрос, вы должны передать объект в качестве аргумента для излучения

// network.ts
commonEmitter.emit('connectionStatusChanged', {data: true});
1 голос
/ 26 января 2020

В этой строке кода:

commonEmitter.on('connectionStatusChanged', this.test()); 

Вы немедленно вызываете this.test(), не передавая ссылку на функцию, которую можно назвать LATER. Измените его следующим образом:

commonEmitter.on('connectionStatusChanged', this.test.bind(this)); 

Итак, вы правильно передаете ссылку на функцию, которая также будет правильно привязана к this.


Или вы можете использовать функция обратного вызова жирной стрелки, которая сохранит лексическое значение this, например:

commonEmitter.on('connectionStatusChanged', () => {
    this.test();
}); 
0 голосов
/ 27 января 2020

Используя это решение, теперь первое событие, генерируемое сетевым классом, никогда не прослушивается .. только после истечения времени ожидания оно работает и обновляет представление, но я не знаю, почему первое не делает: /

// network.ts

commonEmitter.emit('connectionStatusChanged', {isOnline: true});

// view.ts

commonEmitter.on('connectionStatusChanged', (data: any) => {
      console.log('Online? ' + data.isOnline);
});
0 голосов
/ 26 января 2020

Функция стрелки в сочетании с вызовом тестовой функции работала для меня, поэтому спасибо alot @ jfriend000: p Функция с методом bind не сработала, но она в порядке.

У меня просто есть еще один вопрос, каждый время, когда я пытаюсь произвести излучение и событие с любым типом аргументов, слушатель не слушает это. Например:

// view.ts
commonEmitter.on('connectionStatusChanged', (data: boolean) => {
   console.log(data);
}); 

// network.ts
commonEmitter.emit('connectionStatusChanged', true);

Если это также связано с контекстом, как это должно быть сделано?

...