【问题标题】:Angular 2 HttpClient Delete collectionAngular 2 HttpClient 删除集合
【发布时间】:2018-01-29 15:55:39
【问题描述】:

我有一个看起来像这样的服务:

delete<T>(id: number): Observable<T> {
   return this.http.delete<T>(this.url + '/delete/' + id)
          //etc
          //etc
}

现在,我想从forEach 循环中调用此方法,而不会耗尽数据库。

理论上,我可以像这样递归地尝试:

doDeletion(index){
    service.delete()
           .subscribe(success => doDeletion(++index), 
                      err => doDeletion(++index));
}

但是,这似乎不是正确的方法。 forkJoin 属性会为此工作吗?如何在每次调用之前等待而不杀死数据库?

谢谢

【问题讨论】:

  • 没有。 forkJoin 会并行运行它们——我认为这不是你想要的。如果您可以控制该服务,我建议向该服务添加一个方法,该方法获取要删除的项目列表,并让该服务管理该过程。
  • 是的,这就是我想象的@GreyBeardedGeek。我真的很想在没有大量修改的情况下使用旧的后端,因为我正在从 Angular 1 重写前端。但我想这是不可能的......
  • 查看mergeMap(又名flatMap),教程medium.com/@w.dave.w/…
  • 你能改变你调用的后端服务吗?在您当前的实施中,您正在为要删除的每个项目发送一个专用请求。这可能会变慢并导致大量流量。如果你想完全删除你的表,你可以创建一个“delete-all”服务并触发一个删除数据库表中每个条目的 SQL 语句。

标签: angular rxjs observable angular2-observables fork-join


【解决方案1】:

这实际上取决于您期望的输入,但通常您可以使用 concatMap 始终等到当前内部 Observable 完成:

const ids = [42, 24, 17, 1337];

Observable.from(ids)
  .concatMap(id => this.http.delete<T>(this.url + '/delete/' + id))
  .subscribe();

这将在前一个完成后运行每个delete()

您提到您可能想要使用递归。例如,如果一个delete() 调用返回另一个您想要delete() 的ID。对于递归调用它的回调的 expand() 运算符来说,这似乎是一项不错的工作:

Observable.of(id)
  .expand(id => id
    ? this.http.delete(this.url + '/delete/' + id).map(...) // map the response into another id
    : Observable.empty()
  )
  .subscribe();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多