Почему сегмент кода создает утечку памяти? - PullRequest
0 голосов
/ 18 апреля 2019

Я использую сервис http для получения пользовательских данных от UserService.Когда я подчиняюсь наблюдаемому, это создает утечку памяти.На вкладке «Сеть» консоли разработчика видно, что выполняются бесконечные http-запросы.

пытался отписаться в методе ngOnDestroy (), но безуспешно.

user.service.ts

getCurrentUserDetails(){
    return this.http.get<User>(`${this.config.apiUrl}/user/me`);
  }

navbar.component.ts

export class NavbarComponent implements OnInit, OnDestroy {

  user: User;
  userDetailsSubs: Subscription;
  constructor(
    private router: Router,
    private authenticationService: AuthenticationService,
    private userService: UserService
  ) { }

  ngOnInit() {
  }
  isLoggedIn() {
    const currentUser: User = this.authenticationService.currentUserValue;
    if (currentUser) {
      this.userDetailsSubs = this.userService.getCurrentUserDetails()
        .subscribe(
          data => {
            this.user = data;
          }
          , error => {
            console.log(error);
          });
      //this.userDetailsSubs.unsubscribe();
      return true;
    }
    else
      return false;
  }
  logout() {
    this.authenticationService.logout();
    this.router.navigate(['/login']);
  }
  ngOnDestroy() {
    this.userDetailsSubs.unsubscribe();
  }
}


navbar.component.html

<div class="sticky-top mb-3">
  <nav class="navbar navbar-expand-lg navbar-dark bg-danger justify-content-center p-3 mb-3" *ngIf="!isLoggedIn()">
    ..............
  </nav>
  <nav class="navbar navbar-expand navbar-dark bg-danger p-3 mb-5" *ngIf="isLoggedIn()">
      .
      .
      .
  </nav>
</div>

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

Создайте свойство в своем классе, скажем isLoggedInFlag. '

в соответствии с вашим isLoggedIn() методом, установите значение true для подписки.

Ваш взгляд как:

<nav class="navbar navbar-expand-lg navbar-dark bg-danger justify-content-center p-3 mb-3" *ngIf="!isLoggedInFlag">

<nav class="navbar navbar-expand navbar-dark bg-danger p-3 mb-5" *ngIf="isLoggedInFlag">
1 голос
/ 18 апреля 2019

Не вызывайте такой метод в HTML.

*ngIf="isLoggedIn()"

он будет постоянно выполнять этот метод.

1 голос
/ 18 апреля 2019

Ваша функция isLoggedIn() запускается из шаблона при обнаружении изменений. Добавьте свойство isLogged к вашему компоненту и установите его из ngOnInit, чтобы избежать нескольких вызовов.

isLogged: boolean;

ngOnInit() {
  const currentUser: User = this.authenticationService.currentUserValue;
    if (currentUser) {
      this.userDetailsSubs = this.userService.getCurrentUserDetails()
        .subscribe(
          data => {
            this.isLogged = true;
            this.user = data;
          }
          , error => {
            console.log(error);
          });
    }
    else
      this.isLogged = false;
}

...