遍历数组的元素和 return Observable

Iterate through elements and return Observable of array

我有一个 Observable,其中 User 有一个我想遍历的数组 属性 Posts[],调用一个具有中间值的方法,然后 return 一个 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

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

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

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

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

 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$),
        );
}

应该可以,如果不行,我可以给你一个plunker之类的。

希望对您有所帮助。