Rxjs 等待阵列内部的Observable完成。映射

Rxjs 等待阵列内部的Observable完成。映射,rxjs,observable,nestjs,Rxjs,Observable,Nestjs,我有一个对象数组,其中一个键包含一个客户id const customerArray = [{ customerId: 123, ...}, { customerId: 456, ...}]; 我想迭代这个数组,并进行api调用,以从一个单独的端点获取有关该客户的更多详细信息 const mapped = customerArray .map(customer => ({ customerId: customer.customerId, rating: this.pr

我有一个对象数组,其中一个键包含一个客户id

const customerArray = [{ customerId: 123, ...}, { customerId: 456, ...}];
我想迭代这个数组,并进行api调用,以从一个单独的端点获取有关该客户的更多详细信息

const mapped = customerArray
  .map(customer => ({
    customerId: customer.customerId,
    rating: this.productService(customer.customerId)
               .pipe(map(rating => rating))}));
我的期望是,我将拥有一个数组,其中包含具有以下形状的对象:

{
  customerId: number,
  rating: number
}
相反,我的结局是:

{
  customerId: number,
  rating: Observable
}
My
productService
调用在可观察时返回,并在应用程序的其他位置成功使用。我需要让我的
映射
在映射到阵列中的下一个项目之前,等待评级键上的调用完成。

设置显示了一种管理它的方法,但为了使它始终可用

import{Observable,of,from}from'rxjs';
从“rxjs/operators”导入{map,mergeMap,combineAll};
const custary=[{customerId:1},{customerId:2},{customerId:3}];
函数mapSomeStuff(id:number):可观察{
返回(id*id);
}
函数doProductStuff(custArr:Array):可观察{
从(custArray)返回
.烟斗(
映射(异步(客户)=>({
customerId:cust.customerId,
评级:wait mapSomeStuff(cust.customerId).toPromise()
})),
combineAll()
);
}
doProductStuff(custary).subscribe(x=>console.log(x))

这会分解数组并为数组中的每个值创建一个可观察值,运行服务,将可观察值转换为承诺并获取其最终值,然后将所有可观察值合并为一个可观察值,最后输出一个值数组。您可以检查输出并查看
[对象,对象,对象]
,并检查
客户ID
评级
是否在每个
对象上可用

如果我理解正确,您必须迭代一个数组,为数组的每个元素向端点发出http请求,并用端点返回的数据填充数组的每个元素。 因此,如果是这种情况,您可以像这样尝试
mergeMap

const myObs = from(customerArray).pipe(
  mergeMap(customer => {
    return this.productService(customer.customerId).pipe(
      map(rating => ({customerId: customer.customerId, rating}))
    )
  })
)
如果您订阅了
myObs
,您应该会得到一系列您正在寻找的形状的对象,即

{
  customerId: number,
  rating: number
}

mergeMap
,以前称为
flatMap
,允许您展平观察流。换句话说,如果你迭代一个数组来生成一个观察值数组,这应该是你的情况,
mergeMap
允许你提取生成的观察值中的值。

Ah!比我的转换为承诺的解决方案要好得多!我认为唯一的办法是在最后添加
combineAll()
,将其作为单个发出的数组。因此,我可以看到订阅的结果实际上是正确的形状,但我现在遇到了一个问题,我无法将此值放入NestJS内部的API响应中。这是一个与这里要问的问题不同的问题,但是有没有一种方法可以将它从一个可观察的数组转换成一个数组,我可以使用它将数组返回给这个函数的调用者?我尝试添加@JayMcDoniel combineAll(),但这并没有解决问题。由于可观察的键入,请将
combineAll()
更改为
toArray()
,它将给出正确的输出