我对RxJs
和NgRx store
非常陌生,我想要创建一个@Effect
,其中包含两个可观察对象(非常难以解释):< / p>
我的界面如下:
export interface ProductDetails {
product: Product;
productBody: ProductBody;
}
export interface ProductBody{
id: string;
body: string;
}
我试图创建一个新对象productDetails
并设置它的属性。
属性为product
payload
有product
和productBody
从productService(id)
获取(返回observable<productBody>
)
此效果应返回observable<productDetails>
@Effect()
getProductDetails$ = this.actions$
.ofType(ProductActions.GET_STEP)
.map(action => action.payload)
.flatMap(s => {
let body;
this.productService.getStepBody(s.id).subscribe(x => body = x);
return Observable.of({
step: s,
productBody: body
});
})
.map(res => this.productActions.getProductDetailsSuccess(res));
返回:Object {productBody: undefined, product: Object}
我理解为什么要为undefined
返回productBody
但不确定如何修复它。我尝试使用zip
,switchMap
等,但没有机会!
答案 0 :(得分:3)
这是你能做的。
flatMap
超过原始观察值,以便payload.id
将其提供给getStepBody
可观察对象。flatMap
内,您希望map
observable上的getStepBody
返回一个新值,该值是payload
的复合对象以及getStepBody
。 subscribe
获得最终结果。它看起来像这样:
getProductDetails$ = this.actions$
.ofType(ProductActions.GET_STEP)
.map(action => action.payload)
.flatMap(payload => this.productService.getStepBody(payload.id).map(body => ({step: payload, productBody: body})))
.subscribe(res => this.productActions.getProductDetailsSuccess(res)); //res is an object of {step: payload, productBody: body}
如果您不想将整个对象返回到subscribe
函数中的单个函数,则可以对值进行解构以使它们更易于单独使用。要将subscribe
行更改为:
.subscribe(({step, body}) => {//do something with each value});