angular - 如何根据结果进行可观察的调用?
问题描述
情况:
我有一个 http 请求,一旦我得到它,我需要发出另一个请求。但是,我提出的第二个请求取决于第一个请求的结果。如,我的第一个请求返回通过或失败,如果它返回通过我想调用 apiPass,如果它失败我想返回一个不同的 Observable。
我知道如果我在第一个电话之后只有一个电话,我可以使用像 mergemap 这样的东西并编写类似的东西
return this.http.post<{id:string, resPass:boolean}>(this.urlFirst, bodyObject)
.pipe(mergeMap(this.http.get<any>(this.passUrl)));
但我的情况不同——我想使用 resPass 来知道我是否应该调用 pass Api,或者我是否应该执行失败逻辑(它也应该返回一个 Observable,只是一个不同的)。http.get(this.passUrl)
如果第一个调用参数通过,我如何在没有不必要订阅的情况下映射到一个 Observable ( ),otherObservable
如果参数失败,则映射到另一个 ()?
在这两种情况下,我的第一次调用都应该返回http code 200
,所以这也不是 http 失败的问题。
有什么线索吗?
解决方案
如果我理解你的问题是正确的,我会尝试这些方面的东西
return this.http.post<{id:string, resPass:boolean}>(this.urlFirst, bodyObject)
.pipe(
// concatMap is the preferred operator for typical http operations, see below for more details
concatMap(({id:string, resPass:boolean}) => resPass ?
this.http.get<any>(this.passUrl) :
otherObservable)
);
在处理 http 异步请求时,通常最好使用concatMap
操作符,因为这样的操作符确保我们在进行其他与 observable 相关的异步操作之前收到来自 http 的响应,例如在这种情况下,我们可能会在之后进行另一个 http 调用第一个回来了。
在concatMap
我们内部,我们使用解构(即使用这种形式)将预期值的结构定义为从第一次调用返回({id:string, resPass:boolean})
,然后,根据ressPass
我们执行第二次 http 调用或返回的值otherObservable
,假设这已经在之前的某个地方定义过.
阅读这篇文章,您可能会得到一些关于使用 rxjs 和 http 的典型模式的启发。
推荐阅读
- android - Kotlin RxJava: Type mismatch, Observer required but ??? found
- haproxy - 我将如何制作一个清理输入的猫脚本?
- r - 为什么列数很大时 dbGetQuery 需要这么长时间?
- javascript - 无法理解代码示例中的上下文
- php - Laravel, use middleware to find Domain, then get Website row using Domain row.
- html - 角度鼠标悬停并离开不工作 MAT-MENU
- javascript - 删除通过 Podio 电子邮件至项目功能发送的垃圾评论的权限
- python-3.x - 是否可以在 matplotlib 堆栈图中明确设置堆栈的顺序?
- spring - 为什么我的数组从 Spring 变平到 Angular?
- odoo - Odoo - 从销售订单到采购订单的字段