Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度rxjs管道从阵列中移除元素_Javascript_Angular_Rxjs - Fatal编程技术网

Javascript 角度rxjs管道从阵列中移除元素

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)

我有一个带有删除功能的服务。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)
      .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
很好地表达了您想要做的事情,如果可能的话,使用一行程序,可读性会更好:)呵呵,是的。。非常感谢。我被困在我的脑海里。。现在可以使用了,即使是作为全局辅助函数:)