可观察的Foreach进行转换

时间:2018-07-24 12:58:16

标签: rxjs rxjs6

我想从可观察的项目中提取项目并通过foreach对其进行转换,然后将结果保存到新变量中。

我不确定为什么此代码不起作用:

policYears$: Observable<PolicyYear[]>;
policYearsSelector$: Observable<YearSelector.PolicyYear[]>;

this.policYearsSelector$ = this.policYears$.pipe(
    map((year: YearSelector.PolicyYear[]) => year.forEach(y => y.isActive = this.params.policyYearIds.indexOf(y.id) !== -1))
);

我遇到错误:Type 'Observable<void>' is not assignable to type 'Observable<PolicyYear[]>'. Type 'void' is not assignable to type 'PolicyYear[]'. 为什么返回void?

3 个答案:

答案 0 :(得分:1)

array.forEach不返回值,因为它只是用于迭代。因此,year.forEach不会向map返回任何内容,然后void也不返回任何内容。

您需要使用year.map并返回一个值

答案 1 :(得分:0)

您正在映射policeYears$中的数据,且类型为“ PolicyYears []”

所以您必须将代码更改为

policYears$: Observable<PolicyYear[]>;
policYearsSelector$: Observable<YearSelector.PolicyYear[]>;

this.policYearsSelector$ = this.policYears$.pipe(
    map(
        (year: PolicyYear[]): YearSelector.PolicyYear[] => 
             year.forEach(
                  y => y.isActive = this.params.policyYearIds.indexOf(y.id) !== -1
             )
    )
);

year的类型为PolicyYear [],并且地图返回YearSelector.PolicyYear []

热烈的问候

答案 2 :(得分:0)

问题是Array.forEach返回void(因此,您收到的错误消息是因为您现在尝试使用mapPolicyYear[]映射到{{ 1}})。

现在,根据您要执行的操作,您可以继续使用void并只返回更新后的数组:

forEach

或者您可以使用map((year: YearSelector.PolicyYear[]) => { year.forEach(y => y.isActive = this.params.policyYearIds.indexOf(y.id) !== -1); return year; }) 并返回一个新数组:

Array.map