Получить значение из Observable перед повторным выполнением

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

 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?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Не могли бы вы дать мне полный рабочий образец, чтобы я мог понять его больше? :)

maria 18.03.2019 02:53

Вот пример

Aleksey Melnikov 18.03.2019 03:11

Спасибо, обновленная тема с еще одним вопросом об уничтожении.

maria 18.03.2019 03:22
Ответ принят как подходящий

Что вы можете сделать в своей службе, так это внутренне использовать 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$), отписываются от своих соответствующих источников.

Как я могу уничтожить подписку при выходе из компонента?

maria 18.03.2019 03:23

Хороший способ — использовать takeUntil. Проверить 6) Очистить подпискиздесь

user10855567 18.03.2019 03:28

есть ли какой-то tslint, который мне нужно обновить? получить ошибку: prntscr.com/n06edf

maria 19.03.2019 21:38

ОШИБКА в src/app/global.service.ts(18,33): ошибка TS1005: ';' ожидал.

maria 19.03.2019 21:39

Моя инициализация была неправильной, должно быть private _user$ = new BehaviourSubject<any>(null). Обновили ответ!

user10855567 20.03.2019 01:52

все еще получаю: prntscr.com/n0e5xf, вы никогда не упоминали, какой должна быть переменная userChangeSet? в настоящее время это: private userChangeSet = new Subject<any>();

maria 20.03.2019 10:36

Это .user.subscribe должно работать. Если userChangeSet является предметом, вы должны иметь возможность подписаться на него и вызвать .next(), как указано в вашем вопросе.

user10855567 20.03.2019 20:58

я не понимаю, почему у меня это не работает должным образом... код: notes.io/5nTS

maria 20.03.2019 21:11

Вы не забыли добавить get user$ () { return this._user$.asObservable(); } к GlobalService

user10855567 20.03.2019 21:55

я отредактировал: user$ = this._user$.asObservable(); а потом вроде работает.

maria 20.03.2019 22:06

Приятно слышать, что исправили :)

user10855567 20.03.2019 22:27

Другие вопросы по теме