Javascript 角度rxjs管道从阵列中移除元素
我有一个带有删除功能的服务。delete函数将调用api并返回true或false。如果为true,我将在数组中查找索引,拼接它并返回新数组。比如说Javascript 角度rxjs管道从阵列中移除元素,javascript,angular,rxjs,Javascript,Angular,Rxjs,我有一个带有删除功能的服务。delete函数将调用api并返回true或false。如果为true,我将在数组中查找索引,拼接它并返回新数组。比如说 private items = []; onItemDeleted = new Subject<any>(); delete(id:number): Observable<any> { return this.http.delete('http://my.api.com/item/' + id)
private items = [];
onItemDeleted = new Subject<any>();
delete(id:number): Observable<any> {
return this.http.delete('http://my.api.com/item/' + id)
.pipe(
switchMap(checkServerSuccessResponse),
map(data => {
const index1 = this.items.findIndex((element) => {
return element.id === id;
});
if (index1 >= 0 ) {
this.items.splice(index1,1);
}
this.onItemDeleted.next(this.items);
return this.items;
}
),
catchError(returnFalse),
);
}
private items=[];
onItemDeleted=新主题();
删除(id:编号):可观察{
返回此.http.delete('http://my.api.com/item/“+id)
.烟斗(
开关映射(checkServerSuccessResponse),
地图(数据=>{
const index1=this.items.findIndex((元素)=>{
return element.id==id;
});
如果(index1>=0){
本标准中的项目拼接(index1,1);
}
this.onItemDeleted.next(this.items);
归还此物品;
}
),
catchError(returnFalse),
);
}
我有一个开关图的助手:
export function checkServerSuccessResponse(data: Response): Observable<any> {
return (data && data['success'] === true) ? of(data) : throwError("server responded false");
}
导出功能checkServerSuccessResponse(数据:响应):可观察{
返回(数据)&&data['success']==true)?(数据):抛出者错误(“服务器响应错误”);
}
虽然这样做有效,但我感觉地图部分可以重新格式化。我首先想到filter(在switchmap之后)来排除具有我提供的id的元素,然后发出新数组,但后来我意识到,filter没有订阅this.items数组
执行此操作的最佳方法是什么?我不知道您还有其他代码,例如
此.items
来自何处,为什么要将更新的项目发布到onItemDeleted
。但我可能会:a)将这个.items
传递给delete方法,也类似于删除(id,items)
,因为在响应到达时,您不知道这个.items会发生什么;b) 地图中的那个东西,移动到单独的函数,它将是removeById(items,id)
;c) 简化管道
。像这样:
private items = [];
onItemDeleted = new Subject<any>();
removeById(fromItems, id) {
const index1 = fromItems.findIndex((element) => {
return element.id === id;
});
if (index1 >= 0 ) {
fromItems.splice(index1,1);
}
return fromItems;
}
// who ever calls this, should provide copy of items also
// then you will be kinda protected from concurrent
// modification, when http response complete, but this.items
// is completely different, from when http request started
delete(fromItems, id:number): Observable<any> {
return this.http.delete('http://my.api.com/item/' + id)
.pipe(
switchMap(checkServerSuccessResponse),
map(data => this.removeById(fromItems, id)),
tap(items => this.onItemDeleted.next(items)),
catchError(returnFalse),
);
}
private items=[];
onItemDeleted=新主题();
removeById(fromItems,id){
常量index1=fromItems.findIndex((元素)=>{
return element.id==id;
});
如果(index1>=0){
fromtems.拼接(index1,1);
}
退货项目;
}
//谁打过电话,也应该提供物品的副本
//这样你就可以避免并发事件了
//修改,当http响应完成时,但此.items
//与http请求启动时完全不同
删除(fromItems,id:number):可观察{
返回此.http.delete('http://my.api.com/item/“+id)
.烟斗(
开关映射(checkServerSuccessResponse),
映射(data=>this.removeById(fromItems,id)),
点击(items=>this.onItemDeleted.next(items)),
catchError(returnFalse),
);
}
我不知道您还有其他代码,例如此.items
来自何处,您为什么要将更新的项目发布到onItemDeleted
。但是我可能会:a)将这个。items
传递到delete
方法也类似于delete(id,items)
,因为在响应到达时,您不知道这个。items
会发生什么;b) 映射中的那个东西
,移动到单独的函数,即removeById(items,id)
;c) pipe
将变成switchMap(checkServerSuccessResponse)、map(removeById)、tap(onItemDeleted.next)、catchError(returnFalse)
(调用缩写为适合此注释)。移动removeById函数中的delete逻辑也是我想要的。但我不明白的是地图(removeById)。因为在管道堆栈中,第一个参数是来自api调用(checkServerSuccessResponse helper)的响应,而不是this.items数组。。现在说的很有道理。。我一直坚持将函数直接映射到removebyid函数。pipe
很好地表达了您想要做的事情,如果可能的话,使用一行程序,可读性会更好:)呵呵,是的。。非常感谢。我被困在我的脑海里。。现在可以使用了,即使是作为全局辅助函数:)