首页 > 解决方案 > 如何根据结果进行可观察的调用?

问题描述

情况:

我有一个 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 失败的问题。

有什么线索吗?

标签: angularhttprxjsrxjs-pipeable-operators

解决方案


如果我理解你的问题是正确的,我会尝试这些方面的东西

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 的典型模式的启发。


推荐阅读