所以我想一起发送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个端点)处理,但是我很好奇是否有一种方法可以处理单独的请求。
答案 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)
你是什么意思?
所有请求均未通过
后端已经收到这些请求,对其进行处理并做出响应。它们无法撤消。