typescript 在服务中的for循环中获取多个API调用- NGRX

slmsl1lt  于 2022-12-19  发布在  TypeScript
关注(0)|答案(1)|浏览(121)

我有一个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}`,
      );
    }
  }
vnjpjtjt

vnjpjtjt1#

要从httpClient接收数据,您必须订阅请求,例如

this.http.get<Bike>(`${this.myUrl}/BikesInfo/${items[i].bikeId}`).subscribe();

当在NGRX使用的效果中传递观察值时,该订阅会自行发生,想象在效果的末尾某处存在subscribe(),其将订阅您正在传递的任何观察值。
第二种方法的问题再次与Oberables的工作方式有关,您无法await Observable。
为了获得所需的结果,您应该将请求与combineLatest之类的操作符组合在一起,该操作符将等待所有可观察项(在当前情况下为请求)完成,然后返回一个包含聚合响应的数组,如下所示。
x一个一个一个一个x一个一个二个x

相关问题