如何进行两个 API 调用,如果一个调用失败,Angular 中的所有调用都会失败

分享于2022年10月08日 angular rxjs 问答
【问题标题】:How to make two API calls such that if one fails all of them fails in Angular如何进行两个 API 调用,如果一个调用失败,Angular 中的所有调用都会失败
【发布时间】:2022-10-01 16:08:40
【问题描述】:

我在我的角度代码中进行了两个 api 调用(第一个 api 是 POST,第二个是 PUT),我想确保它们要么都成功执行,要么都不成功。

场景:

  1. 意味着如果第一个 api 调用失败,则不应调用第二个 api,并且应该只显示第一个 api 的错误。
  2. 重要案例:如果第一个 api 成功执行而第二个 api 失败,则应该拒绝第一个 api 调用,我应该显示第二个 api 错误(或者说它们都不应该被调用)
    //Just a example call for api
    this.movementService.saveMovementDetails(movData).subsribe()
    this.tourService.saveTourDetails(tourId,tourData).subsribe()
    

    到目前为止,我已经在 RxJS 中尝试了 mergemap、forkJoin,但我无法弄清楚我将如何实现这一点。任何帮助对我来说都意义重大!


【解决方案1】:

这实际上是一个非常困难的问题。这是一个很难解决的分布式事务。我建议不要在客户端这样做。你真的不能相信浏览器来处理这个。您也不能只取消 api 调用,您需要进行额外的 api 调用来回滚成功的 api 调用。如果可能的话,我强烈建议尝试将其变成一个 api 调用/事务。

如果由于某种原因您无法进行一次 api 调用和一次事务,我建议将此逻辑移动到服务器上并使用 saga 模式,如果流程中的后续步骤失败,则流程中的每个步骤都可以回滚。你可以了解更多 here

【讨论】: