Передача параметров в функцию withLatestFrom - PullRequest
0 голосов
/ 28 июня 2018

Я строю магазин действий. Модель моего магазина выглядит так:

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

Я получаю идентификаторы из бэкэнда, которые соответствуют заданным условиям. Затем мне нужно получить из бэкэнда те объекты, которые еще не сохранены. Но я не знаю, как передать извлеченные идентификаторы в 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 голосов
/ 28 июня 2018

Только не используйте withLatestFrom и посмотрите на concatMap. withLatestFrom вызывает свой обратный вызов для каждого излучения из его источника Observable, оставаясь подписанным на все Observables, передаваемые в качестве параметров, но это не то, что вам нужно. Вы хотите вызвать this.checkEntities() только после того, как получите список идентификаторов, а затем создадите новый Observable и подпишитесь на него.

Так что с concatMap у вас будет что-то вроде этого:

map(resp => {
  ...
  return ids;
}),
concatMap(ids => this.checkEntities(ids))
0 голосов
/ 28 июня 2018

Я думаю, вы можете использовать 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
        });
      })
    );
...