如何将observable映射到另一个

时间:2018-05-04 18:02:48

标签: angular observable

我查看了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
    };
  }
}

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

即使我要在地图操作中添加退货声明,我仍然会得到同样的抱怨。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

这是你的单行lambda:

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

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

将其更改为:

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

mapforEach类似,不同之处在于它根据返回的值employee => this.mapEmployeeToMyEmployee(employee)构建新数组。