gpt4 book ai didi

RxJs:如何将两个 observable 组合成一个不同类型的新 observable

转载 作者:行者123 更新时间:2023-12-01 01:52:58 26 4
gpt4 key购买 nike

我对 RxJs 很陌生和 NgRx store ,我想创建一个 @Effect结合两个 observables(很难解释):

我的界面看起来像:

export interface ProductDetails {
product: Product;
productBody: ProductBody;
}

export interface ProductBody{
id: string;
body: string;
}

我正在尝试创建一个新对象 productDetails并设置它的属性。
属性是 product其中 payloadproductproductBodyproductService(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}
我明白为什么返回 undefinedproductBody但不知道如何修复它。我尝试使用 zip , switchMap等等,但没有机会!

最佳答案

这是你可以做的。

  • 您要flatMap在原始 observable 上得到 payload.id把它交给 getStepBody可观察的。
  • 然后,在 flatMap 里面,您要mapgetStepBody observable 返回一个新值,该值是 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});

    关于RxJs:如何将两个 observable 组合成一个不同类型的新 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42809602/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com