【发布时间】:2018-10-30 09:20:06
【问题描述】:
我有一个带有删除功能的服务。删除函数将调用一个 api,它会返回 true 或 false。如果为真,我将在我的数组中查找索引,将其拼接并返回新数组。比如
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),
);
}
我有一个 switchmap 助手:
export function checkServerSuccessResponse(data: Response): Observable<any> {
return (data && data['success'] === true) ? of(data) : throwError("server responded false");
}
虽然这可行,但我感觉地图部分可以重新格式化。我首先想到了过滤器(在 switchmap 之后)以排除具有我提供的 id 的元素,然后发出新数组,但后来我意识到,过滤器没有订阅 this.items 数组。
最好的方法是什么?
【问题讨论】:
-
我不知道你的其他代码,例如
this.items来自哪里,你为什么将更新的项目发布到onItemDeleted。但我可能会:a) 将this.items传递给delete方法也像delete(id, items)因为在响应到达时,您不知道this.items会发生什么; b)map中的那个东西,移动到单独的函数,那将是removeById(items, id); c)pipe将变为switchMap(checkServerSuccessResponse), map(removeById), tap(onItemDeleted.next), catchError(returnFalse)(电话缩写以适应此评论)。 -
在 removeById 函数中移动删除的逻辑,这也是我想要的。但我不明白的是地图(removeById)。因为在管道的堆栈中,第一个参数是来自 api 调用(checkServerSuccessResponse 助手)的响应,而不是 this.items 数组
标签: javascript angular rxjs