有一种情况是,我有一堆从route.params中恢复的I,如下所示:
const ids$ = this.route.params.pipe(
map(params => {
const modelId = +params['modelId'];
const deliverId = +params['deliverId'];
const compositionId = +params['compositionId'];
return { modelId, deliverId, compositionId };
})
);在此之后,我必须从服务器恢复composition对象,因此我执行以下操作:
const getComposition$ = ids$.pipe(
switchMap(ids =>
this.compositionsService.getComposition(ids.compositionId)
)
);现在,我希望有一个具有两个第一个ids的聚合对象,而不是最后一个(compositionId),composition对象,我的意思是:
entities: {
modelId: number;
deliverId: number;
composition: Composition;
};所以我就这么做:
const aggregated$ = forkJoin(ids$, getComposition$).pipe(
map(arr => ({
modelId: arr[0].modelId,
deliverId: arr[0].deliverId,
aggregated: arr[1]
}))
);然后,我订阅了:
const aggregated$.subscribe(aggregated => {
console.log(aggregated);
});但它从不在控制台上打印任何东西。有趣的是,如果我检查对服务器的调用是否已经发出,实际上是这样的,但是最后一个可观察的(aggregated$)从未发出任何东西。
我做错了什么?是否有更好的方法来实现这一点?
发布于 2018-09-26 12:27:43
正如你所说的,ids$和getComposition$实际上都是来自于角的this.route.params。forkJoin操作符需要它的所有源可观测值发出至少一个项,而所有这些都必须完成。这就是当你使用this.route.params时不会发生的事情,因为它是一个从未完成过的主题。
因此,您可以使用例如take(1)来同时完成源ids$和getComposition$
forkJoin(ids$.pipe(take(1)), getComposition$.pipe(take(1))
...发布于 2018-09-26 13:13:59
从可观察到的文件:
forkJoin:等待可观测值完成,然后合并它们发出的最后值。
我认为在您的情况下,forkJoin不会发出,因为ids$没有完成。
你可以尝试的是一些类似的东西
const getComposition$ = ids$.pipe(
switchMap(ids =>
this.compositionsService.getComposition(ids.compositionId).pipe(
map(composition => ({composition, modelId: ids.modelId, deliverId: ids.deliverId))
)
)
);https://stackoverflow.com/questions/52513252
复制相似问题