Фильтровать первый элемент в Observable - PullRequest
0 голосов
/ 14 января 2019

У меня есть следующий компонент:

export class UserComponent implements OnInit {

  user$: Observable<UserModel>;

  constructor(private userService: UserService) { }

  ngOnInit() {

    this.user$ = this.getUser();

  }

  getUser(): Observable<UserModel> {

    return this.userService.getByUserId(25).pipe(map((payload: Payload<UserResponse>) => {

      return payload.result.map((response: UserResponse) => { 

        return {
          id: response.id,
          name: response.name,
          // Other mapping properties
        };

      });

    }));

  }
}

С моим кодом getUser() должен вернуть Observable<UserModel[]>.

Но я знаю, что в этом случае полезная нагрузка имеет только один пользовательский ответ.

Итак, я бы хотел, чтобы метод getUser() возвратил Observable<UserModel>.

Как настроить код канала / карты так, чтобы он возвращал Observable одной UserModel?

Payload

Полезная нагрузка:

export class Payload<T> {

  errors: Error[];
  paging: Paging;
  result: T[];

  constructor(result: T[], paging?: Paging, errors?: Error[]) {

    this.errors = errors;
    this.paging = paging;
    this.result = result;

  }

}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Если вы просто пытаетесь сопоставить ответ сервера, вложенный в свойство results, с новым объектом, вы хотите сопоставить со свойством results, а затем снова сопоставить, чтобы вернуть новый объект. Примерно так:

getUser(userId): Observable<UserDetailModel> {

    return this.userService.getByUserId(userId).pipe(
      map(payload => payload.result[0])
      map(result => {
        return {
          id: result.id,
          name: result.name,
          // Other mapping properties
        };

    }));

  }
0 голосов
/ 14 января 2019

Если я правильно понял, что ваш API отправляет только одну сущность, и вам нужно отобразить эту, чтобы получить Observable И также, как я вижу, интерфейс UserResponse не равен UserModel. Поэтому вам нужно отобразить первый элемент массива, чтобы он занимал только [0], а также реквизиты UserModel:

getUser(): Observable<UserModel> {

    return this.userService.getByUserId(25)
      .pipe(
        map((payload: Payload<UserResponse>) => ({id:payload.result[0], name: payload.result[0].name})
      );

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...