【问题标题】:How to map an observable to another如何将一个可观察对象映射到另一个对象
【发布时间】:2018-05-04 18:02:47
【问题描述】:

我查看了 RxJs 文档并对此进行了搜索,但无法(令人惊讶地)找到我正在尝试做的事情的示例。

基本上,我有两个服务。一个服务消费另一个服务,需要将消费服务的响应映射到另一种类型。

Angular 应用的示例代码:

@Injectable()
export class EmployeesService {

  BASE_URL = 'http://foo.bar.com/api/getEmployees';

  constructor(private http: HttpClient) {
  }

  get(): Observable<IEmployee[]> {
    return this.http.get<IEmployee[]>(this.BASE_URL);
  }
}


@Injectable()
export class MyEmployeeService {

  constructor(private svc: EmployeesService) {
  }

  get(): Observable<IMyEmployee[]> {
    return this.svc.get().map(
        (employees:IEmployee[]) => employees.forEach(employee => this.mapEmployeeToMyEmployee(employee))
    );
  }

  private mapEmployeeToMyEmployee(employee: IEmployee): IMyEmployee {
    return {
      ... simple property mapping to transform IEmployee to IMyEmployee
    };
  }
}

然而,在“MyEmployeeService”中,Typescript 编译器抱怨“返回的表达式类型 Observable(void) 不能分配给类型 Observable(IMyEmployee[])。

即使我要在地图操作中添加返回语句,我仍然会收到同样的投诉。我在这里做错了什么?

【问题讨论】:

    标签: angular observable


    【解决方案1】:

    这是你的单行 lambda:

    (employees:IEmployee[]) => employees.forEach(employee => this.mapEmployeeToMyEmployee(employee))
    

    employees.forEach(...) 返回undefined。由于您使用格式 (...)=&gt;... 而不是 (...)=&gt;{...},因此 lambda 将返回您的单个语句的值 (undefined)。

    改成这样:

    (employees:IEmployee[]) => employees.map(employee => this.mapEmployeeToMyEmployee(employee))
    

    map 类似于forEach,不同之处在于它从employee =&gt; this.mapEmployeeToMyEmployee(employee) 的返回值构建一个新数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多