首页 > 解决方案 > 尝试将 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 来处理这个问题,但我认为这会弄乱函数签名,因为我需要将它们标记为异步。我很难过,希望得到一些指导。

标签: angulartypescriptrxjs

解决方案


您遇到的问题是一个条件返回一个可观察的,而另一个返回一个可观察的返回一个可观察的。您应该使用其中一种展平运算符,例如switchMapconcatMapmergeMap

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 */));
);

推荐阅读