#angular
#angular
Вопрос:
Знаете ли вы, как выполнить второй в нужное время, потому что первый observable выполняет свою работу и переходит непосредственно к методу возврата. И позже после этого код выполняет второе наблюдаемое, и я хочу быть параллельным.
hasEditRechte(): Observable<boolean> {
this.zugriffsrechte = [];
this.getCurrentBenutzer().subscribe(result => {
this.currentLoggedInBenutzer = resu<
this.getBenutzerRolleDTO(this.currentLoggedInBenutzer.id).subscribe(benutzerDTO => {
this.zugriffsrechte = benutzerDTO.zugriffsrechte;
});
});
return of(this.rolleService.hasEditZugriffRechte(this.zugriffsrechte));
}
** -> это произойдет позже, но я хочу, чтобы перед возвратом уже был получен результат отсюда this.zugriffsrechte = benutzerDTO.zugriffsrechte;**
Ответ №1:
Я не тестировал этот код, но я думаю, вам следует использовать switchMap или switchMapTo и избегать использования вложенной подписки. Это может помочь
hasEditRechte(): Observable<boolean> {
this.zugriffsrechte = [];
return this.getCurrentBenutzer().pipe(
tap(result => this.currentLoggedInBenutzer = result),
switchMapTo(this.getBenutzerRolleDTO(this.currentLoggedInBenutzer.id)))
.subscribe(benutzerDTO => {
this.zugriffsrechte = benutzerDTO.zugriffsrechte;
return of(this.rolleService.hasEditZugriffRechte(this.zugriffsrechte));
});
});
}
РЕДАКТИРОВАТЬ 2
Я добавил скобку в конце switchMapTo...
. Пожалуйста, проверьте. Если вы не хотите возвращать подписчика, избегайте .subscribe()
. Я не думаю, что мой код оптимизирован. Попробуйте что-то вроде этого.
hasEditRechte(): Observable<boolean> {
this.zugriffsrechte = [];
return this.getCurrentBenutzer().pipe(
tap(result => this.currentLoggedInBenutzer = result),
switchMapTo(this.getBenutzerRolleDTO(this.currentLoggedInBenutzer.id)))
tap(benutzerDTO => this.zugriffsrechte = benutzerDTO.zugriffsrechte)
map(() => of(this.rolleService.hasEditZugriffRechte(this.zugriffsrechte));
});
});
}
Комментарии:
1. импортируйте {map, tap} из ‘rxjs / operators’; импортируйте {switchMapTo} из ‘rxjs /operators / switchMapTo’; Я добавил этот импорт, но он показывает: свойство Subscribe не существует для типа OperatorFunction «.subscribe (benutzerDTO => {» вот красная строка
2. Ваш код возвращает подписку IntelliJ сообщает мне об изменении возвращаемого объекта с Observable<boolean> на Subscription, и тогда все в порядке. Но я не думаю, что это то, что мне нужно. Он должен возвращать Observable<логическое значение>
3. есть предложения?
4. Я сделал это таким образом с помощью Promise, и после этого я вызываю функцию .затем(значение => {логика внутри}) hasEditZugriffRechte(): Promise<логическое значение> { верните this.getCurrentBenutzer().pipe( коснитесь (результат => this.currentLoggedInBenutzer = результат), switchMapTo(this.getBenutzerRolleDTO(this.currentLoggedInBenutzer.id ))) .toPromise().then((значение: BenutzerRolleDTO) => this.rolleService.hasEditRechte(значение.zugriffsrechte)); }
5. Ваша последняя идея не верна, потому что второй «кран», как он подключен? точки нет, и если я поставлю точку, все равно не сработает.