angular - 尝试将 http 请求链接在一起并将最终输出作为可观察对象返回
问题描述
在使用 Typescript 时,我在将 observables 链接在一起时遇到了一些问题,这很有意义。因此,在我写的这个示例中,将取决于其值的 ia 条件将执行函数或在执行函数之前进行一些预处理。
这样做时,我注意到问题区域正试图返回一个Observable<Observable<number>>
不是我的目标的。我的想法是返回内部值,但我不确定如何真正处理它。
b(data: number): Observable<number> { return of(data); } // This is a stub.
a(data: number): Observable<number> {
const fn = (x): Observable<number> => {
return of(x) // this is a stub which would be the result of an http request.
}
if(data < 3) {
return fn(data);
} else {
return b(data).pipe(map( x => fn(x) )) // Problem line
}
}
这假设如何处理?我在想可能有一种方法可以使用 Promise 来处理这个问题,但我认为这会弄乱函数签名,因为我需要将它们标记为异步。我很难过,希望得到一些指导。
解决方案
您遇到的问题是一个条件返回一个可观察的,而另一个返回一个可观察的返回一个可观察的。您应该使用其中一种展平运算符,例如switchMap、concatMap或mergeMap。
return b(data).pipe(switchMap(x => fn(x)))
也许这也可以从重新设计中受益?取而代之的是有两个单独的返回,而是从条件语句的结果创建一个流,并将其通过管道传输到函数。这样您就不必定义一个函数,这样您就可以在两个地方使用它。
b(data: number): Observable<number> { return of(data); } // This is a stub.
a(data: number): Observable<number> {
const src$ = data < 3 ? of(data) : b(data);
return src$.pipe(switchMap(x => of(x) /* your stub function */));
);
推荐阅读
- .net - Visual Studio - 在 MacOs 中将 Nuget 包添加到项目时,拒绝访问路径“/Users/.local/share/NuGet”
- python - 我有一个基于 4 个值的动态 xpath,如果我使用 OR 条件,xpath 看起来很大,还有其他处理方法吗?
- ios - 如何在 iOS 中为 WKWebView 启用 GamePad 功能?
- xamarin.forms - 使用 xamarin.forms 为 android 和 ios 的警报消息设置自定义字体
- c# - C# 用一个属性满足两个接口的成员
- flutter - 当Inner ScrollView到达Bottom-Flutter时如何滚动BottomNavigationBar
- python - 为函数上的变量分配不同的索引
- reactjs - 如何解决“无法更新状态”
- r - 如何在R中所有列之间的数据框中找到相交?
- algorithm - 查找此分区问题的枢轴