【发布时间】:2020-09-04 08:21:11
【问题描述】:
通过外部 REST 调用获取具有 ShoppingCartItems 的 ShoppingCart,之后 ShoppingCartItems 的 Observable 进行内部调用以使用 Provider 增强 ShoppingCartItems。
内部调用后的点击(console.log)显示 ShoppingCart 的内容与预期的一样 - 5 个 ShoppingCartItems 使用 Provider 进行了增强。但是,点击订阅会返回 5 个警报,每个警报都包含我想添加为 ShoppingCartItem 属性的提供者。
看来我使用了错误的 mergeMap/concatMap/switchMap - 或者在一个或两个调用结束时没有执行某种“收集”。
电话:
getShoppingCart$(userId: number): Observable<ShoppingCart> {
return this.rest.getShoppingCart$(userId)
.pipe(
mergeMap(
(shoppingCart) => from(shoppingCart.shoppingCartItems)
.pipe(
concatMap(
item => this.rest.getProviderByWine$(item.wine.id)
.pipe(
map(provider => item.provider = provider),
)
),
// Returns ShoppingCart with Providers added
tap(() => console.log('ShoppingCart: ' + JSON.stringify(shoppingCart)))
)
),
)
}
订阅:
ngOnInit(): void {
this.shoppingCartService.getShoppingCart$(1037).subscribe(
(shoppingCart: ShoppingCart) => {
this.dataSourceShoppingCart = new NestedMatTableDataSource<ShoppingCartItem>(shoppingCart.shoppingCartItems);
// Runs 5 times - each time displaying a Provider, not the ShoppingCart
alert(JSON.stringify(shoppingCart))
}
);
}
实际的 REST 调用:
getShoppingCart$(userId: number): Observable<ShoppingCart> {
return this.http.get<ShoppingCart>(this.getBaseUrl() + 'users/' + userId + '/shopping-cart');
}
getProviderByWine$(wineId: number): Observable<any> {
return this.http.get<Provider>(this.getBaseUrl() + 'wine/' + wineId + '/provider');
}
非常感谢任何指针。 Angular 版本是 8。
【问题讨论】:
-
您似乎想要进行后续调用,其中一个调用取决于外部调用的结果......为此使用
switchMap。你可以在这里阅读更多信息:-- medium.com/@luukgruijs/… -
没错
标签: angular rxjs rxjs-observables rxjs-pipeable-operators