在Angular中一个接一个地同步调用可观察对象

时间:2018-06-26 17:44:15

标签: angular typescript rxjs

我有以下服务电话:
productService.GetAllProducts()
productService.DeleteProduct()
productService.GetCategories()
productService.DeleteCategory()

在sudo代码中,我需要在组件中执行以下操作:

  1. 使用productService.GetAllProducts()获取产品列表。

  2. 浏览产品列表,并为每个产品调用productService.DeleteProduct()。

  3. 一旦我可以确认上述删除全部完成(由于数据库限制),则需要使用productService.GetCategories()获得类别列表。遍历每个类别并调用productService.DeleteCategory()。

我知道,如果我有更好的后端调用来进行批量删除,我的生活将会轻松很多,但是在这种情况下,我别无选择。我需要遵循获取列表,循环浏览列表,逐个删除每个项目的模式。

使用flatMap和可观察到的完整参数甚至有可能做我想做的事情吗?我最大的问题是在搜索并删除所有类别之前,知道代码何时完成删除所有产品。

1 个答案:

答案 0 :(得分:2)

您可能想尝试以下方法

productService.GetAllProducts()
.switchMap(
   products => forkJoin(products.map(product => productService.DeleteProduct(product)))
)
.switchMap(() => productService.GetCategories())
.switchMap(
   categories => forkJoin(categories.map(category => productService.DeleteCategory(category)))
)
.subscribe(() => console.log('done'))

整个想法如下

  • GetAllProducts返回一个产品数组,该数组作为 第一个switchMap
  • 的参数
  • Products数组通过map转换为 DeleteProduct结果的可观察值-的数组 Observable作为参数传递给第一个forkJoin
  • forkJoin在其接收到的所有可观测对象发出时发出 参数完整,因此当所有产品 已被删除
  • 对类别重复相同的推理

我不确定代码在语法上是否完美,但足以让您了解如何进行操作。