遍历元素并返回数组

时间:2018-02-16 08:50:20

标签: arrays angular observable rxjs5

我有一个Observable,其中User有一个我希望迭代的数组属性Posts [],调用一个带有中间值的方法,然后返回一个带有结果对象作为数组的Observable。

目前我有以下代码可行:

    public ngOnInit() {
    const results: any[] = [];
    this.controlData$ = this.controlContent$
        .pipe(
            filter((input) => input !== null),
            flatMap((p: IControlContentSection) => p.controlPerformers),
            map((m: IControlPerformer) => {
                results.push({
                        ...m,
                        nextOccurrence: this.getNextControlDate(m.controlFrequency, m.firstOccurrence),
                    });
                return results;
                }),
            takeUntil(this.destroy$),
            );
}

我使用数组变量results: any[],但我不喜欢这个解决方案,因为它依赖于这个外部变量,只有在组件被初始化时才能工作。

我尝试在地图后使用toArray()reduce((x, y) => x.concat(y), []),但这会在模板中解析为 null

如何在不需要外部变量的情况下返回Observable?

在模板中,我通过异步管道订阅:

<div *ngIf="controlData$ | async as controllers">
  ...
  <div *ngFor="let ctrl of controllers; trackBy:ctrl?.userId">
  ...
  </div>
</div>

1 个答案:

答案 0 :(得分:1)

你在地图后正确地做它,它应该工作。但要模拟您的确切行为,您需要扫描操作员。当您返回结果数组时,扫描运算符将发出中间值。 你试过这样的吗?:

 public ngOnInit() {
    this.controlData$ = this.controlContent$
    .pipe(
        filter((input) => input !== null),
        flatMap((p: IControlContentSection) => p.controlPerformers),
        map((m: IControlPerformer) => {
            return {...m,
                    nextOccurrence: this.getNextControlDate(m.controlFrequency, m.firstOccurrence),
                };
         }),
         scan((acc, cur) => [...acc, cur], [])
         takeUntil(this.destroy$),
        );
}

它应该可以工作,如果没有,我可以提供给你一个左右。

希望这有帮助。