将参数传递给withLatestFrom函数

时间:2018-06-28 10:09:20

标签: angular rxjs ngxs

我正在建立商店行动。 我的商店模型如下:

{
    entities: {[n:number]: Client},
    ids: number[],
}

我从后端获取与给定条件对应的ID。 然后,我需要从后端获取那些尚未存储的实体。 但是我不知道如何将获取的ID传递给withLatestFrom函数?

const params = {
    conditions,
    fields: ['id']
};
this.apiService.getList(params)
    .pipe(
    map(resp => {
      const ids: number[] = [];
      resp.map((item: Client) => {
        ids.push(+item.id);
      });
      return ids;
    }),
    withLatestFrom(this.checkEntities()), // how to pass ids ?
    tap(resp => {
      patchState({
        entities: resp[1],
        ids: resp[0],
        loading: false
      });
    })
    );

private checkEntities(ids: number[]) {
    const params: ApiWyszukiwarka = {
      conditions: {id: ids},
      fields: 'all'
    };
    return this.apiService.getList(params);
}

或者我做错了什么?

2 个答案:

答案 0 :(得分:2)

请不要使用withLatestFrom来代替concatMapwithLatestFrom在其源Observable的每次发射中都调用其回调,同时保持订阅作为参数传递的所有Observable,但这不是您所需要的。您只想在获取ID列表之后再调用this.checkEntities(),然后创建一个新的Observable并订阅它。

因此,使用concatMap时,您将得到以下内容:

map(resp => {
  ...
  return ids;
}),
concatMap(ids => this.checkEntities(ids))

答案 1 :(得分:0)

我认为您可能想使用mergeMap而不是withLatestFrom

mergeMap允许您映射到可观察对象,然后“解开”该可观察对象。

this.apiService.getList(params)
    .pipe(
      map(resp => resp.map(item => +item.id),
      mergeMap(ids => this.checkEntities(ids)),
      tap(resp => {
        patchState({
          entities: resp[1],
          ids: resp[0],
          loading: false
        });
      })
    );