将参数传递给 withLatestFrom 函数

Posted

技术标签:

【中文标题】将参数传递给 withLatestFrom 函数【英文标题】:Passing params to withLatestFrom function 【发布时间】:2018-12-07 09:01:40 【问题描述】:

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


    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);

或者我做错了什么?

【问题讨论】:

withLatestFrom 不支持参数,而是您可以使用 switchMap 和 forkJoin 一起使用,如此处所述 - ***.com/questions/49774676/… 【参考方案1】:

我想你可能想使用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
        );
      )
    );

【讨论】:

当我使用mergeMap 时,我得到entities 作为resp - 不是这两个观察值的数组:/【参考方案2】:

不要使用withLatestFrom,而是使用concatMapwithLatestFrom 对来自其源 Observable 的每个发射调用其回调,同时保持订阅所有作为参数传递的 Observable,但这不是您需要的。您只想在获得 id 列表后调用 this.checkEntities(),然后创建一个新的 Observable 并订阅它。

所以使用concatMap 你会得到这样的东西:

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

【讨论】:

当我使用concatMap 时,我得到entities 作为resp - 不是这两个观察值(实体和ID)的数组:/ 这显然只是你链中的重要部分。不知道拿到`this.checkEntities(ids)`后你想做什么 对,我可以map checkEntities 并合并结果。谢谢 @piernik map checkEntities 是什么意思并结合结果?

以上是关于将参数传递给 withLatestFrom 函数的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给查询访问 VBA

useState 更新状态值,但将旧值作为参数传递给函数

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

如何将参数传递给flutter integration_test?

将参数传递给函数

将数组中的所有值作为参数传递给函数