ANGULAR - Как работает сервис EventEmitter, указанный ниже? - PullRequest
0 голосов
/ 29 мая 2020

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

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

конкретно эта строка: private stati c emitters : {[notificationName: string]: EventEmitter} = {}

import { Injectable } from '@angular/core';
import { EventEmitter } from '@angular/core';

@Injectable({ providedIn: 'root' })
export class EventEmitterService {

    private static emitters: { [notificationName: string]: EventEmitter<any> } = {}

    static get(notificationName: string): EventEmitter<any> {
        if (!this.emitters[notificationName])
            this.emitters[notificationName] = new EventEmitter<any>();
        return this.emitters[notificationName];
    }
}

/** 
to SUBSCRIBE:

private subscriptions = new Subscription();   
constructor(){
    this.subscriptions.add( EventEmitterService.get("notification_name").subscribe(payload => this.notificationHandler(payload)) );
}

TO EMIT: 

EventEmitterService.get("notificationName").emit(payload); 

to UNSUBSCRIBE:

ngOnDestroy(){
    this.subscriptions.unsubscribe();
}
*/

Следуя инструкциям пользователя Michael D, я изменил код

import { Subject } from 'rxjs';

private emitters: { [notificationName: string]: Subject<any> } = { };

и получил эта ошибка:

Error

Ошибка была вызвана тем, что возврат static get(notificationName: string): не был изменен на Observable<any>

Итак, окончательная форма обслуживания, обновленная в соответствии с комментарием MichaelD:

import { Injectable } from '@angular/core';
import { EventEmitter } from '@angular/core';
import { Subject, Observable } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class EventEmitterService {

    // private static emitters: { [notificationName: string]: EventEmitter<any> } = {}
    private  emitters: { [notificationName: string]: Subject<any> } = {};


    get(notificationName: string): Observable<any>{
        if (!this.emitters[notificationName])
            this.emitters[notificationName] = new EventEmitter<any>();
        return this.emitters[notificationName];
    }
}

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Я часто встречал этот образец использования EventEmitters в сервисах. EventEmitters НЕ предназначены для использования в службах. Он используется для передачи настраиваемых событий от компонентов родительским компонентам.

EventEmitter является расширением интерфейса Rx JS Subject. Если в службе требуется наблюдаемая многоадресная рассылка, то можно использовать Rx JS Subject (или BehaviorSubject).

В вашем случае переменная emitter является объектом со свойством notificationName, который будет указывать на эмиттер.

Также я не понимаю значение static здесь. Сервис уже сделан синглтоном с аргументом { providedIn: 'root' }. Не будет нескольких экземпляров emitters.

Вы также можете иметь такое же поведение со следующим

import { Subject } from 'rxjs';

private emitters: { [notificationName: string]: Subject<any> } = { };
1 голос
/ 29 мая 2020
private static emitters: { [notificationName: string]: EventEmitter } = {}

Эта строка просто означает, что emitters является внутренним свойством класса EventEmitterService объекта типа, для которого ключи являются строками, а значения экземплярами EventEmitter. Он используется для отслеживания активных подписок. Потребителей сервиса не волнуют другие потребители, они просто хотят emit или subscribe для данного уведомления, поэтому оно является частным.

Если вы посмотрите на EventEmitter интерфейс, вы увидите, что вы действительно можете emit или subscribe. Когда вы запускаете, вы отправляете полезную нагрузку, которая будет передана в качестве параметра потребителям функций, на которые подписаны.

Когда вы subscribe на EventEmitter, он возвращает подписку, которую вы затем можете unsubscribe из . Когда вы добавляете свою подписку EventEmitter в subscriptions, вы позволяете себе отказаться от подписки сразу на все из них, позвонив по номеру unsubscribe.

1 голос
/ 29 мая 2020

Модель источника событий в основном следует наблюдаемой модели. В приведенном выше коде I мы создали эмиттер stati c, что означает, что мы можем вызывать его без экземпляра класса. Таким образом, мы получим такое поведение, как полезность. Вам нужно понять только одно. Излучатели постоянно слушают События, и по мере того, как событие происходит, они выдают ответ независимо от успеха или неудачи. Этот ответ очень похож на прерывание, сгенерированное оборудованием в нашей ОС, которое заставляет ЦП прослушивать это прерывание c вместо выполнения других задач. Итак, когда у нас есть обновление в нашем событии, EventEmitter будет транслировать это изменение, и наши слушатели обнаружат его на этом конкретном c Event

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...