繁体   English   中英

Rxjs:map 数组字段中的每个元素来自 object 的可观察对象和另一个可观察对象

[英]Rxjs: map each element in an array field from an observable of object with another observable

我有一个名为 getTransactionDetails(id:string) 的方法,它返回一个 Observable of TransactionDetails object

getTransactionDetails(id:string):Observable<TransactionDetails> 

TransactionDetails object 如下所示:

class TranscationDetails{
    id:string;
    accessCode: string;
    veggiesList: Array<Veggie>;
    meatList: Array<Meat>;
}

Veggie object 看起来像这样:

class Veggie{
    id: string;
    name: string;
}

我有另一个方法叫做 getVeggieSummary(veggieId: string),它返回一个 VeggieSummary 的 Observable:

getVeggieSummary(veggiesId:string):Observable<VeggieSummary>

VeggieSummary 看起来像这样

class VeggieSummary{
    id:string;
    name:string;
    color:string;
    kind:string;
}

我想调用 getTransactionDetails(1),并将 veggiesList 中的所有 Veggies 元素转换为 VeggieSummary 并返回一个 VeggieSummary 数组。

这就是我所拥有的

getTransactionDetails(1)
.flatMap(transactionDetails=>
    transactionDetails.veggiesList
       .map(veggie=>getVeggieSummary(veggie.id)))
.subscribe(result=>
    console.log(result)
)

目前, result是一个Observable<VeggieSummary>并且内部 observable 甚至没有被订阅......

我怎样才能拥有一个带有 rxjs 运算符的Observable<VeggieSummary[]>

注意:我的app的angular版本不支持pipe,RxJS版本是v5

您能否尝试使用forkjoin包装数组以查看它是否解决了问题? 我认为目前它正在返回Observable<VeggieSummary>[]

getTransactionDetails(1)
.flatMap(transactionDetails=>
    forkJoin(transactionDetails.veggiesList
       .map(veggie=>getVeggieSummary(veggie.id))))
.subscribe(result=>
    console.log(result)
)

您只需要用forkJoin包装内部可观察对象,这会将Observable<VeggieSummary>[]转换为Observable<VeggieSummary[]>

    getTransactionDetails(1)
      .flatMap((transactionDetails) =>
        forkJoin(
          transactionDetails.veggiesList.map((veggie) =>
            getVeggieSummary(veggie.id)
          )
        )
      )
      .subscribe((result) => console.log(result));

使用forkjoin,这有效:

  getTransactionDetails(1)
  .flatMap((transactionDetails) =>
    forkJoin(
      transactionDetails.veggiesList.map((veggie) =>
        getVeggieSummary(veggie.id)
      )
    )
  )
  .subscribe((result) => console.log(result));

我发现 zip 与传播运算符 (...) 也有效:

   getTransactionDetails(1)
  .flatMap((transactionDetails) =>
    zip(
      ...transactionDetails.veggiesList.map((veggie) =>
        getVeggieSummary(veggie.id)
      )
    )
  )
  .subscribe((result) => console.log(result));

我从另一篇文章中了解到的。

但我不确定使用哪个,forkjoin 还是 zip? 有关系吗?

我还从该帖子中了解了 rest 运算符/展开运算符 (...)。

但是我仍然不太了解它在这个例子中是如何工作的。

我不确定我使用的是哪个,我使用的是 rest 还是传播运算符?

它等价于什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM