我有一个方法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 ) )),