尝试将 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 可观察。您应该使用一种扁平化运算符,例如 switchMap、concatMap 或 mergeMap.
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 */));
);
在使用 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 可观察。您应该使用一种扁平化运算符,例如 switchMap、concatMap 或 mergeMap.
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 */));
);