通过 pipe() 中的 switchMap() 展开可观察数组 return
Flatten array of observables return by switchMap() in pipe()
我有一个方法 getFolders()
returns 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);
}
我需要 总文件数 9 (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
包裹observable数组并移除mergeAll()
,它会执行里面的每一个observable
switchMap( folderData => forkJoin(folderData.map( data => data.files ) )),
我有一个方法 getFolders()
returns 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);
}
我需要 总文件数 9 (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
包裹observable数组并移除mergeAll()
,它会执行里面的每一个observable
switchMap( folderData => forkJoin(folderData.map( data => data.files ) )),