0

I want to emit a string when the util.service.ts handled some errors, so that i can get this message in app.component.ts and show it, but i can not subscribe the emitter. this is my code, but it do not work:

in util.service.ts:

export class UtilService {
  errMsgEmitter = new EventEmitter();
  private handleError(error: Response | any) {
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body['error'] || JSON.stringify(body);
      errMsg = `${error['status']} - ${error['statusText'] || ''} ${err}`;
    } else {
      errMsg = error['message'] ? error['message'] : error.toString();
    }
    console.error(errMsg);
    this.errMsgEmitter.emit(errMsg);
    return Observable.throw(errMsg);
   }
  /**
   * get event emitter
   * @returns {EventEmitter<any>}
   */
  getNavChangeEmitter() {
    return this.errMsgEmitter;
  }

in app.component.ts i have this:

ngOnInit() {
  this.utilService.getNavChangeEmitter()
   .subscribe(data => {
     this.errMsg = data;
   });
  }

Can anybody help me? Thanks a lot

2 Answers2

0

You can use Subject as Observable as below.

import { Subject }    from 'rxjs/Subject';

export class UtilService {
  private message = = new Subject<string>();

  public errorMessage$ = this.message.asObservable();
  private error: string = '';

  private handleError(error: Response | any) {
    this.error = '';
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body['error'] || JSON.stringify(body);
      this.error = `${error['status']} - ${error['statusText'] || ''} ${err}`;
    } else {
      this.error = error['message'] ? error['message'] : error.toString();
    }
    console.error(this.error);
    this.message.next(this.error);
  }
}

// app.component.ts

ngOnInit() {
  this.utilService.errorMessage$.subscribe(error => {
    this.errMsg = error;
  });
}
ranakrunal9
  • 13,320
  • 3
  • 42
  • 43
0

Suddenly I resolved this by make a static Subject:

util.service.ts:

static errSubject: BehaviorSubject<any> = new BehaviorSubject<any>('');

app.component.ts:

    UtilService.errSubject
      .subscribe(data => {
        this.errMsg = data;
      });

and do not forget provide UtilService in app.module.ts