【问题标题】:Filter first item in Observable过滤 Observable 中的第一项
【发布时间】:2019-06-08 15:28:24
【问题描述】:

我有以下组件:

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&lt;UserModel[]&gt;

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

所以我希望getUser() 方法返回Observable&lt;UserModel&gt;

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

  }

}

【问题讨论】:

  • 也许您想使用switchMap,但我实际上不确定您要的是什么。 switchMap 会将上下文“切换”到您在 map 回调中返回的内容,因此它不会像现在这样嵌套。
  • 该部分返回 this.userService.getByUserId(25) ... 返回一个 Observable 但由于我知道响应只有一项我需要 getUser() 来返回 Observable。你明白吗?
  • 或多或少。可能你想要switchMap
  • 管道(map(payload=>payload[0]))?
  • 只需从数组的第一个元素然后payload.result[0]创建你想要返回的对象。

标签: angular angular7 angular-observable


【解决方案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})
      );

  }

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • payload.result 是一个数组,所以这不应该解决。但是将 Observable 映射两次看起来不错,并且我会说使 OP 代码更清晰。
    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多