Не удается передать данные через службу через HttpInterceptor

Я создал MessageService, в который я помещаю данные, которые затем считываются моим app.main для отображения этих сообщений пользователю. Когда я использую эту службу в компоненте, она работает нормально. Что я хочу сделать, так это переместить это на уровень HttpInterceptor, который будет отслеживать все HttpResponse для сообщений сервера и передавать их в службу для отображения пользователем.

Вот мой сервис:

@Injectable()
export class MessageService {
  private successMessageList = new Subject<string>();
  successMessages$ = this.successMessageList.asObservable();

  constructor() { }

  addSuccessMsg(msg: string) {
    this.setMsgs(this.successMessageList, msg);
  }

  private setMsgs(privMsgArray: Subject<string>, newMsgs: any) {
    let messages = [];
    messages.push(newMsgs);

    messages.forEach(message => privMsgArray.next(message));
    console.log(this.successMessageList);
  }
}    

Вот мой HttpInterceptor

@Injectable()
export class MyHttp implements HttpInterceptor {
  constructor(private messageService: MessageService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).do((event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          if(event.body['successMsg']) {
             this.messageService.addSuccessMsg(event.body['successMsg']);
          }
        }
      })
  }
}

Это мой app.main, который читает данные

export class AppComponent implements OnInit {
  successMessages = [];

  constructor(private messageService: MessageService) { }

  ngOnInit(): void {
    this.messageService.successMessages$.subscribe(
      message => {
        console.log(message);
        setTimeout(() => {
          this.successMessages.push(message);
        });
      });
  }
}

С некоторыми операторами консоли я вижу, что данные правильно попадают в частный метод messageService.setMsgs(...), но никогда не достигают моего app.main, как это происходит, когда я отправляю сообщения через компоненты. Нет никаких сообщений об ошибках или чего-то еще, это просто не работает.

Я заметил одну вещь: в MessageService.setMsgs(..) я поместил оператор консоли для successMessageList. Когда я добавляю сообщение через компонент, я получаю вывод, который выглядит следующим образом (ПРИМЕЧАНИЕ observers: Array(1) vs observers: Array(0) )

Subject {_isScalar: false, observers: Array(1), closed: false, isStopped: false, hasError: false, …}

Но когда я добавляю сообщение через HttpInterceptor, я получаю это

Subject {_isScalar: false, observers: Array(0), closed: false, isStopped: false, hasError: false, …}

Любые идеи о том, что происходит, будут очень признательны!

Я использую Angular 5


person Raymond Holguin    schedule 21.11.2017    source источник
comment
я думаю, вам нужно нажать на successMessages, который является субъектом, который будет выдавать значения для компонента, где вы делаете это локально для службы   -  person Rahul Singh    schedule 21.11.2017


Ответы (1)


Эта проблема была 100% ошибкой пользователя. В моем компоненте app.main я объявлял messageService как provider в @Component, поэтому служба не была общим синглтоном, как я ожидал. После того, как я удалил это, все работает как положено.

person Raymond Holguin    schedule 21.11.2017