代码之家  ›  专栏  ›  技术社区  ›  Jake Shakesworth

如何将一个可观察对象映射到另一个可观察对象

  •  1
  • Jake Shakesworth  · 技术社区  · 7 年前

    我已经查看了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[])。

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Pearman    7 年前

    这是你的单线lambda:

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

    employees.forEach(...) 退货 undefined .由于您使用的格式 (...)=>... 而不是 (...)=>{...} lambda返回单个语句的值( 未定义 )。

    将其更改为:

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

    map 就像 forEach ,但它会根据 employee => this.mapEmployeeToMyEmployee(employee)