有两组可观察的(网络请求)。
在第一个可观察的问题解决之后,我需要forkJoin
个多个可观察的问题。
但是作为回报,我得到了一个Subscriber
。
请检查一下提琴小提琴 https://stackblitz.com/edit/zj3mhp?file=index.ts
import { forkJoin, of, timer } from "rxjs";
import { map } from "rxjs/operators";
let array = [of({ data: [1] }), of({ data: [2] })];
const init = of({ pages: 2 });
function gerData() {
const observable = forkJoin(array);
return init.pipe(
map(data => {
return observable.subscribe(data => {
const arr = [];
data.forEach(x => {
arr.push(...x.data);
});
console.log('array', arr);
return arr;
});
})
);
}
gerData().subscribe((data) => {
console.log('final data: ', data);
})
答案 0 :(得分:2)
您可以使用mergeMap()
代替map(),返回订阅将无济于事。
无论我们在map()
中返回什么,它将是在订阅成功回调中收到的值。我们无法从订阅对象中检索值。
在mergeMap
中,我们返回一个Observable,它将与父Observable合并,并且可以使用单个订阅获取合并的Observable的值。
import { forkJoin, of, timer } from "rxjs";
import { map, mergeMap } from "rxjs/operators";
let array = [of({ data: [1] }), of({ data: [2] })];
const init = of({ pages: 2 });
function gerData() {
const observable = forkJoin(array);
return init.pipe(
mergeMap(data => {
return observable.pipe(map(data => {
const arr = [];
data.forEach(x => {
arr.push(...x.data);
});
console.log('array', arr);
return arr;
}));
})
);
}
gerData().subscribe((data) => {
console.log('final data: ', data);
})
答案 1 :(得分:1)
您可以做类似的事情
function gerData() {
const observable = forkJoin(array);
return init.pipe(
switchMap(() => observable),
map(res => res.reduce((prev, next) => prev.concat(next.data), []))
);
}
gerData().subscribe(data => {
console.log("final data: ", data);
});
答案 2 :(得分:0)
一旦您订阅observable
,它开始执行并变成subscription
,您应该返回observable
并使用switchMap
来运行该可观察对象。请尝试以下操作:
function gerData() {
return init.pipe(switchMap(data=>
forkJoin(array).pipe(map(arr=>arr.map(item=>item.data)))
));
}