Javascript 如何使用rxjs在Angular中嵌套api调用?
如何使用rxjs在angular中嵌套api调用Javascript 如何使用rxjs在Angular中嵌套api调用?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,如何使用rxjs在angular中嵌套api调用 getProducts(): Observable<any> { return this.getProductIDs().pipe( map((respnose) => respnose.products.map((data) => (item: any) => flatMap(() => this.getProduct(item.id))
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
map((respnose) =>
respnose.products.map((data) => (item: any) =>
flatMap(() => this.getProduct(item.id))
)
)
);
}
// with promises we can do something like promise.all([])... how can I achieve something similar using rxjs
&如果我这样做:
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
map((respnose) =>
respnose.products.map((item: any) => this.getProduct(item.id))
)
);
}
有人能提出将一个可观察结果映射到嵌套api调用(返回可观察结果)的想法吗
注意
getProduct()
也是一个返回observable的api调用
getProduct(id): Observable<any> {
return this.http.get<Observable<any>>(
`http://localhost:4401/api/products/${id}`,
{
params: { id },
}
);
}
getProduct(id):可观察{
返回this.http.get(
`http://localhost:4401/api/products/${id}`,
{
参数:{id},
}
);
}
这可能就是你要找的。你没有真正告诉我们你想做什么,所以它是非常开放的:
这将发出一个对象(产品)数组,其ID从getProductIDs
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
map(res =>
res.products.map(product => this.getProduct(product.id))
),
switchMap(getProducts => forkJoin(getProducts))
);
}
getProducts():可观察{
返回此.getProductId()管道(
地图(res=>
res.products.map(product=>this.getProduct(product.id))
),
开关映射(getProducts=>forkJoin(getProducts))
);
}
通过将地图合并到switchMap中,同样的内容写得更简洁一些:
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
switchMap(res => forkJoin(
res.products.map(product => this.getProduct(product.id))
))
);
}
getProducts():可观察{
返回此.getProductId()管道(
开关映射(res=>forkJoin(
res.products.map(product=>this.getProduct(product.id))
))
);
}
这里有一种不用forkJoin的方法,每个产品一次发射一个(不是在数组中)
getProducts():可观察{
返回此.getProductId()管道(
合并映射(res=>res.products),
mergeMap(product=>this.getProduct(product.id))
);
}
这是同样的东西,但它再次发射阵列:
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
mergeMap(res => res.products),
mergeMap(product => this.getProduct(product.id)),
toArray()
);
}
getProducts():可观察{
返回此.getProductId()管道(
合并映射(res=>res.products),
mergeMap(product=>this.getProduct(product.id)),
toArray()
);
}
如何组合观测值取决于具体的用例(是否需要从第一个到第二个的数据才能访问第二个,是否希望同时发出两个结果,等等)。阅读在哪个用例中使用哪个组合器的文档:似乎您有与此处相同的问题:
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
switchMap(res => forkJoin(
res.products.map(product => this.getProduct(product.id))
))
);
}
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
mergeMap(res => res.products),
mergeMap(product => this.getProduct(product.id))
);
}
getProducts(): Observable<any> {
return this.getProductIDs().pipe(
mergeMap(res => res.products),
mergeMap(product => this.getProduct(product.id)),
toArray()
);
}