我有一个bike对象数组,我想根据bike对象的数量执行多个API调用,但我不认为使用for循环调用多个api是最好的方法。
是否有更好的首选项来执行此操作?
效果.ts
public getMyBikes = createEffect(() =>
this.actions$.pipe(
ofType(getBikes),
withLatestFrom(this.store.select(getBikes)),
switchMap(([_, bikes]) =>
this.myService.getSelectedBikes(bikes).pipe(
map(() => {
return bikesSuccess();
}),
catchError((error: Error) => of(bikesError({ error }))),
),
),
),
);
服务.ts
public getSelectedBikes(
bikes: Array<Bike>,
): Observable<Bike> {
for (let i = 0; i < bikes.length; i++) {
this.http.get<Bike>(
`${this.myUrl}/BikesInfo/${items[i].bikeId}`,
);
}
}
我也试过有承诺的,但是我对效果中的可观察性有一些问题。
public async getSelectedBikes(
bikes: Array<Bike>,
): Promise<Observable<Bike>> {
for await (const bike of bikes) {
this.http.get<Bike>(
`${this.myUrl}/BikesInfo/${bike.bikeId}`,
);
}
}
1条答案
按热度按时间vnjpjtjt1#
要从
httpClient
接收数据,您必须订阅请求,例如当在NGRX使用的效果中传递观察值时,该订阅会自行发生,想象在效果的末尾某处存在
subscribe()
,其将订阅您正在传递的任何观察值。第二种方法的问题再次与Oberables的工作方式有关,您无法
await
Observable。为了获得所需的结果,您应该将请求与
combineLatest
之类的操作符组合在一起,该操作符将等待所有可观察项(在当前情况下为请求)完成,然后返回一个包含聚合响应的数组,如下所示。x一个一个一个一个x一个一个二个x