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

Я сейчас получаю новое обновленное значение пользователя следующим образом:

 this.Service.user$.subscribe(data => {
      this.userData = data;
      this.userId = data._id;
    });

, но updateUser выполняется только каждые 5 секунд.

Таким образом, перед загрузкой userData и UserId пустые.

Есть ли способ, которым я могу получить сохраненные пользовательские данные из того, что уже есть в службе, вместо того, чтобы ждать 5 секунд, пока оно будет выполнено снова?

что-то вроде:

 this.Service.user$().GET((data:any) => { // gets the value already stored

    });

Как мне это сделать?

Сервисный код:

     user$: Observable<any>;


  constructor(private http: HttpClient, private router: Router) {
    this.user$ = this.userChangeSet.asObservable();
  }



  updateUser(object) {
    this.userChangeSet.next(object);
  }

Edit:

Кроме того, как мне отменить все подписки на ngOnDestroy событие?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

То, что вы можете сделать в своем сервисе, это использовать BehaviourSubject для хранения значений, но представить его как Observable.

Вот цитата из документов, подробно описывающая, что такое BehaviourSubject

Одним из вариантов Subjects является BehaviorSubject, который имеет понятие «текущее значение».Он хранит последнее значение, отправленное его потребителям, и всякий раз, когда подписывается новый Observer, он сразу же получает «текущее значение» от BehaviorSubject

См. здесь для получения дополнительной информации.

Сервисный код:

private _user$ = new BehaviourSubject<any>(null); // initially null

constructor(private http: HttpClient, private router: Router) {
  this.userChangeSet.subscribe(val => this._user$.next(val))
}

get user$ () {
  return this._user$.asObservable();
}

Тогда вы можете использовать его как обычный компонент в вашем компоненте.

this.service.user$.subscribe(v => {
  // do stuff here
})

Обратите внимание, что первое значение, которое получит компонент, будет нулевым, поскольку это начальное значение объекта BehaviourSubject.

РЕДАКТИРОВАТЬ:

В компоненте

private _destroyed$ = new Subject();

public ngOnDestroy (): void {
    this._destroyed$.next();
    this._destroyed$.complete();
}

И затем для подписки

this.service.user$.pipe(
  takeUntil(this._destroyed$)
).subscribe(v => {
  // do stuff here
})

Это работает так, что когда испускается уничтоженный $ subject, наблюдаемые, которые передали takeUntil(this._destroyed$), будутотписаться от соответствующих источников.

1 голос
/ 18 марта 2019

Использовать BehaviorSubject для userChangeSet.Он выдает значение сразу после подписки.Пример:

userChangeSet = new BehaviorSubject<any>(this.currentData);
...