我正在建立商店行动。 我的商店模型如下:
{
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);
}
或者我做错了什么?
答案 0 :(得分:2)
请不要使用withLatestFrom
来代替concatMap
。 withLatestFrom
在其源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
});
})
);