将参数传递给 withLatestFrom 函数
Passing params to withLatestFrom function
我正在建立商店行动。
我的商店模型如下所示:
{
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);
}
或者我做错了什么?
我想你可能想使用 mergeMap
而不是 withLatestFrom
。
mergeMap
允许您映射到一个可观察对象,然后 "unwrap" 那个可观察对象。
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
});
})
);
只是不要使用 withLatestFrom
,而是查看 concatMap
。 withLatestFrom
在保持订阅所有作为参数传递的 Observable 的同时,对来自其源 Observable 的每个发射调用其回调,但这不是您所需要的。您只想在获得 ID 列表后调用 this.checkEntities()
,然后创建一个新的 Observable 并订阅它。
所以 concatMap
你会得到这样的东西:
map(resp => {
...
return ids;
}),
concatMap(ids => this.checkEntities(ids))
我正在建立商店行动。 我的商店模型如下所示:
{
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);
}
或者我做错了什么?
我想你可能想使用 mergeMap
而不是 withLatestFrom
。
mergeMap
允许您映射到一个可观察对象,然后 "unwrap" 那个可观察对象。
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
});
})
);
只是不要使用 withLatestFrom
,而是查看 concatMap
。 withLatestFrom
在保持订阅所有作为参数传递的 Observable 的同时,对来自其源 Observable 的每个发射调用其回调,但这不是您所需要的。您只想在获得 ID 列表后调用 this.checkEntities()
,然后创建一个新的 Observable 并订阅它。
所以 concatMap
你会得到这样的东西:
map(resp => {
...
return ids;
}),
concatMap(ids => this.checkEntities(ids))