Angular 在角度上一个接一个地同步调用观测值

Angular 在角度上一个接一个地同步调用观测值,angular,typescript,rxjs,Angular,Typescript,Rxjs,我有以下服务电话: productService.GetAllProducts productService.DeleteProduct productService.GetCategories productService.DeleteCategory 在sudo代码中,我需要在组件中执行以下操作: 使用productService.GetAllProducts获取产品列表 循环浏览产品列表,并为每个产品调用productService.DeleteProduct 一旦我可以确认由于db限制,

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

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

使用productService.GetAllProducts获取产品列表

循环浏览产品列表,并为每个产品调用productService.DeleteProduct

一旦我可以确认由于db限制,上述删除都已完成,我需要使用productService.GetCategories获取类别列表。循环遍历每个类别并调用productService.DeleteCategory

我知道,如果我有更好的后端调用来执行批量删除,我的生活会轻松得多,但在这种情况下,我没有选择。我需要遵循这样的模式:获取一个列表,在其中循环,逐个删除每个项目


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

您可能想尝试类似的方法

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返回一个产品数组,该数组作为 第一个开关映射的参数 Products数组通过map转换为 由DeleteProduct生成的可观测值-数组 Observable作为其参数传递给第一个forkJoin forkJoin在接收到的所有可观察对象都是 参数完成,因此当所有产品 已被删除 同样的推理也适用于类别
我不确定代码在语法上是否完美,但它应该足以让您了解如何继续操作。

您可能想尝试类似的方法

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返回一个产品数组,该数组作为 第一个开关映射的参数 Products数组通过map转换为 由DeleteProduct生成的可观测值-数组 Observable作为其参数传递给第一个forkJoin forkJoin在接收到的所有可观察对象都是 参数完成,因此当所有产品 已被删除 同样的推理也适用于类别
我不确定代码在语法上是否完美,但它应该足以让您了解如何继续。

您已经问了同样的问题:。你得到了一个答案和几个链接。那篇文章中的链接并不能解决我的问题。你是真的在读我想做的事情,还是只是根据标题立即将事情标记为重复?我意识到我的问题与你链接的帖子略有不同,所以创建了一个新帖子。它们确实解决了你的问题。但是观察是很困难的,你需要仔细阅读这些文章,如果需要的话,需要多次阅读,并在拒绝解决方案之前进行实验。如果你在文章/建议中有什么不明白的地方,那就要求澄清,而不是重复同样的问题。明白了,我会更彻底地阅读。不管怎样,你可以给我一个大致的想法,看看我的4个sudo代码步骤,上面我需要为每个部分提供哪些函数?使用forkJoin从需要并行执行的几个函数中创建一个单独的可观察函数,即许多删除。使用switchMap一个接一个地执行一个可观察对象。您已经问了相同的问题:。你得到了一个答案和几个链接。那篇文章中的链接并不能解决我的问题。你是真的在读我想做的事情,还是只是根据标题立即将事情标记为重复?我意识到我的问题与你链接的帖子略有不同,所以创建了一个新帖子。它们确实解决了你的问题。但是观察是很困难的,你需要仔细阅读这些文章,如果需要的话,需要多次阅读,并在拒绝解决方案之前进行实验。如果你在文章/建议中有什么不明白的地方,那就要求澄清,而不是重复同样的问题。明白了,我会更彻底地阅读。不管怎样,你可以给我一个大致的想法,看看我的4个sudo代码步骤,上面我需要为每个部分提供哪些函数?使用forkJoin从需要并行执行的几个函数中创建一个单独的可观察函数,即许多删除。使用switchMap执行一个接一个的可观察操作。感谢您提供的出色答案。实际上,我最终以类似的方式解决了它,仍然使用forkJoin和map进行删除,因此它们并行进行,但将每个delete可观测值设置为一个变量,然后使用concat并订阅它。有点像这样。。。订阅GetAllProducts,然后在其中创建一个执行forkJoin和map的常量deleteProducts。然后订阅GetCatego
然后在其中创建一个常量deleteCategories来进行forkJoin和映射。最后,const deletes=concatdeleteProducts,deleteCategories.subscribe。如果出于某种原因您觉得switchMap技术更好,请告诉我。我不确定我是否理解逻辑,但乍一看,我怀疑您如何确定deletes=concatdeleteProducts,使用deleteProducts和deleteCategories运行的deleteCategories.subscribe实际上是指向2 forkJoin结果的变量,它们尚未定义。我建议的方法是一系列操作符,一步一步地将第一个源可观测值转换为其他可观测值,直到你得到最后一个你订阅的源以完成任务。一般来说,我倾向于认为你订阅的越少越好。通过这个链,我建议你总是知道自己在做什么,并且,不知何故,你能够重新控制异步事件流,比如你正在描述的事件流。谢谢你的回答。实际上,我最终以类似的方式解决了它,仍然使用forkJoin和map进行删除,因此它们并行进行,但将每个delete可观测值设置为一个变量,然后使用concat并订阅它。有点像这样。。。订阅GetAllProducts,然后在其中创建一个执行forkJoin和map的常量deleteProducts。然后订阅GetCategories,然后在其中创建一个常量deleteCategories来进行forkJoin和映射。最后,const deletes=concatdeleteProducts,deleteCategories.subscribe。如果出于某种原因您觉得switchMap技术更好,请告诉我。我不确定我是否理解逻辑,但乍一看,我怀疑您如何确定deletes=concatdeleteProducts,使用deleteProducts和deleteCategories运行的deleteCategories.subscribe实际上是指向2 forkJoin结果的变量,它们尚未定义。我建议的方法是一系列操作符,一步一步地将第一个源可观测值转换为其他可观测值,直到你得到最后一个你订阅的源以完成任务。一般来说,我倾向于认为你订阅的越少越好。通过这个链,我建议你总是知道自己在做什么,并且,不知何故,你能够重新控制异步事件流,比如你正在描述的事件流。