尝试将 http 请求链接在一起并 return 最终输出作为可观察的

trying to chain http requests together and return the final output as an observable

在使用 Typescript 时,我在将可观察对象链接在一起时遇到了一些问题,这样才有意义。所以在我写的这个示例中,我有一个条件,它取决于它的值,将执行一个函数或在执行函数之前做一些预处理。

在执行此操作时,我注意到问题区域正在尝试 return 一个 Observable<Observable<number>>,这不是我的目标。我的想法是 return 内在价值,但我不确定如何真正处理它。

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 来处理这个问题,但我认为这会扰乱函数签名,因为我需要将它们标记为异步。我很困惑,希望得到一些指导。

您遇到的问题是一个条件 returns 可观察,而另一个 returns 可观察 returns 可观察。您应该使用一种扁平化运算符,例如 switchMapconcatMapmergeMap.

return b(data).pipe(switchMap(x => fn(x)))

也许这也可以从重新设计中获益?取而代之的是有两个单独的 returns,从条件语句的结果创建一个流并将其通过管道传递给函数。这样你就不必定义一个函数,这样你就可以在两个地方使用它。

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