Rxjs 等待阵列内部的Observable完成。映射
我有一个对象数组,其中一个键包含一个客户idRxjs 等待阵列内部的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
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
}
MyproductService
调用在可观察时返回,并在应用程序的其他位置成功使用。我需要让我的映射
在映射到阵列中的下一个项目之前,等待评级键上的调用完成。设置显示了一种管理它的方法,但为了使它始终可用
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()
,它将给出正确的输出