过滤Observable中的第一项

时间:2019-01-14 16:00:25

标签: angular angular7 angular-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()应该返回Observable<UserModel[]>

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

所以我希望getUser()方法返回Observable<UserModel>

如何调整管道/地图代码以返回一个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;

  }

}

2 个答案:

答案 0 :(得分:1)

如果我正确理解为您的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})
      );

  }

答案 1 :(得分:1)

如果您只是想将嵌套在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
        };

    }));

  }