Угловой ngrx — и маршрутизатор.События внутри Rxjs combineLatest не работают

#angular #typescript #rxjs #observable #ngrx

Вопрос:

У меня проблемы с проблемой, которую я не могу решить:

 onSelectCompany() {
 combineLatest([this.idCompany$, this.idUser$, this.router.events]).subscribe(res => {
   if(res[2] instanceOf NavigationEnd){
     this.router.navigateByUrl(`get-info/${res[0]/res[1]`)
   }
 })
}
 

и я вызываю эту функцию на ngOnInit моего компонента, у меня есть два наблюдаемых объекта, которые мне нужны, как параметры моего URL-адреса, и мне нужно перемещаться по этому URL-адресу, только если я не обновил страницу. Но функция, которую я пишу, не работает, у меня нет ошибки, но при отладке выполнение не входит в подписку. Почему?

Комментарии:

1. все 3 должны что-то испускать после выполнения этой функции

2. вместо этого нет, если я удалю этот.маршрутизатор.события, это сработает… проблема в маршрутизаторе.наблюдаемые события… Я не могу понять, почему

3. да, потому что router.events будет выдавать что-то только при наличии события маршрутизации

4. итак, я не могу использовать combineLatest в этом случае

5. Я обновил свой ответ «решением».

Ответ №1:

Все 3 наблюдаемых объекта должны что-то испускать после выполнения этой функции.

Источник: https://www.learnrxjs.io/learn-rxjs/operators/combination/combinelatest

 Be aware that combineLatest will not emit an initial value 
until each observable emits at least one value.
 

1 решением может быть перемещение функции с ngOnInit уровня поля или в конструктор

Ответ №2:

Возможно, вы можете обойти его, используя startWith оператора для имитации события маршрутизатора. И вам также было бы проще, если бы вы разрушили combineLatest результат, вместо того чтобы обращаться к нему с помощью индексов.

 onSelectCompany() {
 const helper$ = this.router.events.pipe(startWith(null)); // or some other 'safe' value
 combineLatest([this.idCompany$, this.idUser$, helper$])
 .subscribe(([ companyId, userId, routerEvent ]) => {
 // destructure the res array and access the values with variable names
   if(routerEvent instanceOf NavigationEnd){
     this.router.navigateByUrl(`get-info/${companyId}/${userId}`)
   }
 })
}