过滤 Observable 中的第一项

Filter first item in Observable

我有以下组件:

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() 应该 return a Observable<UserModel[]>.

但我知道在这种情况下有效负载只有一个 UserResponse。

所以我想 getUser() 方法 return Observable<UserModel>.

如何将管道/映射代码调整为 return 一个 UserModel 的 Observable?

有效载荷

有效载荷是:

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;

  }

}

如果我理解正确的话,你的 API 只发送一个实体,你需要映射这个实体才能获得 Observable 而且正如我所见,UserResponse 接口不等于 UserModel。因此,您需要将数组的第一个元素映射为仅采用 [0] 以及 UserModel props:

getUser(): Observable<UserModel> {

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

  }

如果您只是想将嵌套在 results 属性 中的服务器响应映射到一个新对象,您需要映射到 results 属性,然后再次映射到 return 新对象。像这样:

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
        };

    }));

  }