Flatten由switchMap()在pipe()中返回的可观察对象数组



我有一个方法getFolders(),它返回Observable

function getFolders() {
const data = [
{
name: "Photos",
files: of(2) // observable
},
{
name: "Document",
files: of(5) // observable
},
{
name: "Videos",
files: of(2) // observable
}
];
return of(data);
}

我需要得到总文件数with is9(2+5+2)。我编写了一个函数来完成这项工作,使用方法如下:

getFileCount.subscribe( totalCount => console.log(totalCount) );
// expects to log 9

实现是,

function getFileCount() {
return getFolders()
.pipe(
switchMap( folderData => folderData.map( data => data.files ) ),
// Above switchMap returns [ Observable, Observable, Observable ]
// Now I need to complete all Observable and get flatten result like [2,5,2]
mergeAll(),
// I though the mergeAll will resolve all Observables and return the value

switchMap( countArray => {
// expecting all values in a single array [2,5,2]
// but it executes for each value like
// 2
// 5
// 2
console.log(countArray);
return countArray.reduce(function(a, b) { return a + b; }, 0);
})
);
}

使用forkJoin封装可观察数组并删除mergeAll(),它将执行

内部的每个可观察对象
switchMap( folderData => forkJoin(folderData.map( data => data.files ) )),


最新更新