Как использовать ngOninit с асинхронными данными

Я вызываю метод службы внутри метода ngOninit и присваиваю возвращаемое значение этого метода службы переменной-члену. Позже я хочу снова использовать это значение переменной внутри ngOnInit. Но, я полагаю, из-за проблем с синхронизацией этой переменной не присвоено какое-то значение YET, но она уже пыталась получить доступ к его значению. Как я могу исправить эту проблему? заранее спасибо

Я использую метод ngOnInit:

ngOnInit() {

    //Execute a service method here to get the user Id.
    this.authorizeService.getUser().subscribe(data => {
      this.userId = +data.sub;
    });

    //Pass the userId as a parameter to get the list associated with that user.
    this.service.getList(this.userId).subscribe(data => {
      this.list = data;
    })
  }

Но там написано, что cannot read property sub of null. Я нахожусь в учетной записи, и я уже пытался вложить эти два вызова. Результат тот же.

Мне нужно вложить эти два вызова подписки в switchMap или mergeMap. Но я не мог хорошо понять их синтаксис.

getUser() метод обслуживания

  public getUser(): Observable<IUser | null> {
    return concat(
      this.getUserFromStorage().pipe(filter(u => !!u), tap(u => 
      this.userSubject.next(u))),
      this.userSubject.asObservable());
  }

getList() метод обслуживания

  getList(userId: number): Observable<number[]> {
    return this.http.get<number[]>("myApiURLhere?userId=" + userId)
      .pipe(
        retry(1),
        catchError(this.errorHandler)
      );
  }

Ошибка:

Argument of type '(data: IUser) => void' is not assignable to parameter of type '(value: IUser, index: number) => ObservableInput<any>'.

Тип void нельзя присвоить типу ObservableInput.


person zodiac645    schedule 03.06.2020    source источник
comment
Вопрос редактируется ngOnInit() методом. Пожалуйста, дайте мне знать, если вам понадобится больше.   -  person zodiac645    schedule 04.06.2020


Ответы (2)


Какую версию angular вы используете?, Если вы покажете код, чтобы увидеть больше деталей и иметь возможность помочь

person luis Murillo    schedule 03.06.2020
comment
попробуйте ngAfterViewInit и отладьте данные. возможно, структура ответа отличается - person luis Murillo; 05.06.2020

Поскольку обе функции являются асинхронными вызовами, вы можете использовать оператор switchMap rxjs, чтобы избежать работы с несколькими подписками:


import { switchMap} from 'rxjs/operators';

ngOnInit() {
 this.authorizeService.getUser().pipe(
  switchMap(data => {
   this.service.getList(+data.sub)
})).subscribe( data => this.list = data)
}
person Gérôme Grignon    schedule 03.06.2020
comment
Я попытался вложить вызовы подписки, как вы сказали, если это было то, что вы имели в виду, но не получилось. - person zodiac645; 04.06.2020
comment
Вы уверены, что ваш синтаксис правильный? Я получаю ошибки типа - person zodiac645; 04.06.2020
comment
откуда у вас эти ошибки? Я бы подумал о том, чтобы проверить, имеет ли + data.sub правильный тип в качестве параметра для getList () - person Gérôme Grignon; 05.06.2020