Angular Apollo嵌套查询结果映射Observable类型问题求助
问题分析与解决方案
你现在的核心问题是直接调用subscribe()会返回Subscription类型,而不是你需要的Observable<string | Error>。RxJS里subscribe是用来触发Observable执行并消费数据的,它不会返回Observable流,所以不能作为方法的返回值。
要实现你要的串行请求逻辑,应该用RxJS的管道操作符(比如switchMap、catchError)来串联异步操作,全程保持Observable流,这样才能返回符合类型要求的Observable。
修正后的代码如下:
eval(someId: number): Observable<string | Error> { return this.apollo.query<FirstQuery>({ query: FirstDocument, variables: { id: someId } }).pipe( // 处理第一个请求的结果,发起第二个请求 switchMap(({ data: result }) => { const firstObject = result.first; // 返回第二个请求的Observable,继续流的传递 return this.apollo.query<SecondQuery>({ query: SecondDocument, variables: { id: firstObject.secondId } }).pipe( // 拿到第二个请求的结果,结合第一个对象处理返回值 map(({ data: secondResult }) => { const secondObject = secondResult.second; return someFunction(firstObject, secondObject); }) ); }), // 捕获整个流中的任何错误,返回Error类型的Observable catchError(error => of(error)) ); }
关键要点说明:
switchMap: 用于将第一个Observable的结果映射到第二个Observable,实现串行请求的逻辑。它会取消前一个Observable的订阅(如果有的话),刚好适合你的场景:等第一个请求完成再发第二个。map: 用于处理第二个请求的数据,结合第一个请求的结果调用someFunction,返回最终需要的字符串。catchError: 捕获整个流中(第一个或第二个请求)出现的错误,用of(error)把错误包装成Observable返回,保证返回类型符合Observable<string | Error>。- 全程没有调用
subscribe(),而是通过pipe组合操作符,保持流为Observable类型,这样就能直接作为方法的返回值。
内容的提问来源于stack exchange,提问作者Scott Deerwester
相关产品推荐
相关产品推荐

