提问者:小点点

如何以异步方式删除/更新以及何时应该取消订阅?


我目前是Angular的新手。

异步管道的主要目标之一是自动为您处理订阅和取消订阅。

1.当处理删除或更新(两者都是API服务)时,我是否需要通过ngOnDestroy取消订阅?

projects$: Observable<Project[]>;

constructor(
    private projectService: ProjectService,
) { }

ngOnInit() {
    this.loadProject();
}   


loadProject(){
    this.projects$ = this.projectService.getProjects()
    .pipe(
        map(result => {
            if(result.success){
                return result.data;
            }
        })
    );
}


deleteProject(){
    if(this.projectToDelete){
        const id = this.projectToDelete.id;
        this.projectService.deleteProject(id).subscribe(result => {
            if(result.success){
                this.loadProject();
            }
        });
    }
}

是否有另一种方法可以从可观察中删除特定元素,而无需再次调用刷新项目$的api?类似于这样,而不是上面的:

//In this case this.projects type is not an Observable.
deleteProject(){
    if(this.projectToDelete){
        const id = this.projectToDelete.id;
        this.projectService.deleteProject(id)
        .subscribe(result => {
            if(result.success){
                this.projects = this.projects.filter(item => {
                    return item.id != id;
                });
                this.projectToDelete = null;
                this.closeModal();
            }
        });
    }
}

共1个答案

匿名用户

这确实取决于您的要求,但您始终可以使用async管道,它将通过订阅取消订阅来为您处理可观察对象的生命周期

-您可以使用一些RxJS运算符来为您处理取消订阅。像取(1)first()of()from()

-取消订阅NgDestroy正如你所提到的

此外,销毁对于可观察性来说不是一件事,您可以取消订阅完成或两者兼而有之。

响应式编程中的FYI最好采用声明式方法

等等,那是什么?

testObject$ = this.http.get(url).pipe(
      map((resp: any) => 
           ({
            id: resp.data.id,
            view: resp.data.view,
            resourceName: resp.data.resourcename,
            loadCapacity: resp.data.loadcapacity
          }) as TestObject)
      );

  }

你看到我做了什么吗?我删除了方法。

然后在您的组件中,您将其称为testService. testObject$

你看到我做了什么,我摆脱了这种方法,原因如下:

  1. -利用rxjs可观察对象和opeartors的力量
  2. -有效兼容的流
  3. -轻松共享可观察对象
  4. -随时对用户操作做出反应