多个同时POST请求,如果一个或另一个失败则不发送任何一个

时间:2019-04-26 06:39:55

标签: angular typescript http rxjs

所以我想一起发送2个发布请求,但我希望这样,以便如果2个请求中的任何一个失败(例如,意外错误),则实际上没有任何请求可以通过。 假设2个发布请求是后端的独立功能(即2个独立的端点)。

我已经搜索并发现了一些相对类似的问题,但是如果一个请求失败,所有解决方案都不会取消两个请求,并且其中许多都使用了似乎不推荐使用的功能(mergeMap,{{ 1}},...)

尝试

我尝试了多种选择:

将一个请求映射到另一个请求:

forJoin

嵌套订阅:

(我知道这不是好习惯)

this.service.postFunction1(body1).pipe(
  map(()=>this.service.postFunction2(body2).subscribe(
    res=>{
      /** Stuff here... **/
    },
    err=>{
      /** Stuff here... **/   //Should I stop here the whole thing here?
    })
  )
).subscribe(
  res=>{
    /** Stuff here... **/
  },
  err=>{
    /** Stuff here... **/
  })
)

现在我将它们完全分开,因为我不清楚如何将它们组合在一起,牢记“如果一个失败,它们都会失败”。

也许我只需要修改后端并将2个post请求作为一个函数(1个端点)处理,但是我很好奇是否有一种方法可以处理单独的请求。

2 个答案:

答案 0 :(得分:1)

您可以使用cancatMap()。如果您可以将API网址排列在要调用API的数组中,并按顺序排列,则可以使用类似以下内容:

// consider these as API urls
urls = ['url1', 'url2', 'url3']

from(this.urls).pipe(
  concatMap((eachUrl, index) => {
    if (index === 1) {
      return throwError('Error in Second') // simulated error thrown by second API call
    }
    // simulated API calls, you just need to return this, not the error simulation
    // return your API call here and that's all under your concatMap()
    return of(eachUrl).pipe(tap(_ => console.log('API url invoked -> ', eachUrl)))
  })
).subscribe((data) => {
  console.log(`data in subscribe `, data);
}, (err) => {
  console.log(`error in subscribe: `, err)
})

您将看到第三个API调用不会触发。

concatMap()将等待请求完成,然后再发送下一个。

在此处查看示例:https://stackblitz.com/edit/angular-qo1luf?file=src/app/app.component.ts

答案 1 :(得分:0)

你是什么意思?

  

所有请求均未通过

后端已经收到这些请求,对其进行处理并做出响应。它们无法撤消。