Как я могу запустить это внутри observable для выполнения в нужное время, но не позже

#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. Ваша последняя идея не верна, потому что второй «кран», как он подключен? точки нет, и если я поставлю точку, все равно не сработает.