В настоящее время я получаю новое обновленное значение пользователя следующим образом:
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);
}
Редактировать:
Кроме того, как бы я удалил все подписки на событие ngOnDestroy?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте BehaviorSubject для userChangeSet. Он выдает ценность сразу после подписки. Пример:
userChangeSet = new BehaviorSubject<any>(this.currentData);
Вот пример
Спасибо, обновленная тема с еще одним вопросом об уничтожении.
Что вы можете сделать в своей службе, так это внутренне использовать BehaviourSubject для сохраните значения, но выставьте это как Observable.
Вот цитата из документов, подробно описывающая, что такое BehaviourSubject.
One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the 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
})
Обратите внимание, что первое значение который компонент получит, будет нулевым, так как это начальное значение Предмет поведения.
Обновлено:
В компоненте
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
})
Это работает следующим образом: когда объект destroy$ излучает, наблюдаемые объекты, передавшие takeUntil(this._destroyed$), отписываются от своих соответствующих источников.
Как я могу уничтожить подписку при выходе из компонента?
Хороший способ — использовать takeUntil. Проверить 6) Очистить подпискиздесь
есть ли какой-то tslint, который мне нужно обновить? получить ошибку: prntscr.com/n06edf
ОШИБКА в src/app/global.service.ts(18,33): ошибка TS1005: ';' ожидал.
Моя инициализация была неправильной, должно быть private _user$ = new BehaviourSubject<any>(null). Обновили ответ!
все еще получаю: prntscr.com/n0e5xf, вы никогда не упоминали, какой должна быть переменная userChangeSet? в настоящее время это: private userChangeSet = new Subject<any>();
Это .user.subscribe должно работать. Если userChangeSet является предметом, вы должны иметь возможность подписаться на него и вызвать .next(), как указано в вашем вопросе.
я не понимаю, почему у меня это не работает должным образом... код: notes.io/5nTS
Вы не забыли добавить get user$ () { return this._user$.asObservable(); } к GlobalService
я отредактировал: user$ = this._user$.asObservable(); а потом вроде работает.
Приятно слышать, что исправили :)
Не могли бы вы дать мне полный рабочий образец, чтобы я мог понять его больше? :)