Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 遍历元素并返回数组的可观察值_Arrays_Angular_Observable_Rxjs5 - Fatal编程技术网

Arrays 遍历元素并返回数组的可观察值

Arrays 遍历元素并返回数组的可观察值,arrays,angular,observable,rxjs5,Arrays,Angular,Observable,Rxjs5,我有一个Observable,其中用户有一个数组属性Posts[],我想遍历它,用中间值调用一个方法,然后返回一个Observable,结果对象作为数组 目前,我有以下代码可以使用: public ngOnInit() { const results: any[] = []; this.controlData$ = this.controlContent$ .pipe( filter((input) => input !==

我有一个Observable,其中用户有一个数组属性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

在不需要外部变量的情况下,我如何返回一个可观测值

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

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

...
...

地图绘制完成后,如果操作正确,应该可以正常工作。但要模拟你的确切行为,你需要一个扫描操作符。当您返回结果数组时,扫描操作符将发出中间值。 你这样试过吗

 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$),
        );
}
如果不行的话,我可以给你一个打劫器


希望这能有所帮助。

谢谢Llorence,使用扫描确实有效,返回阵列的可见光。