如何实现链式请求并在单个Observable中返回多请求结果?
解决方案
我明白你的问题啦——你当前用switchMap的写法会直接把第一个请求的结果替换成第二个请求的,所以订阅时只能拿到最后一次请求的用户数据。要把两个请求的结果合并到同一个Observable里,我们只需要在switchMap中把两个请求的结果打包成一个对象,同时加上你提到的检查字段N的逻辑,调整后的代码如下:
// 定义一个合并后的Observable,包含reservation和user数据 this.combinedData$ = this.rest_angular.all('reservations') .get(route.params.id, { expand: 'beddingConfig,agentSummary,providerTitle' }) .pipe( // 先检查返回结果中的字段"N"是否为true,不符合则终止流 filter(reservation => reservation.N === true), // 发起第二个请求,并将两次请求的结果合并为一个对象 switchMap(reservation => this.rest_angular.all('users').get(reservation.agentId).pipe( map(user => ({ reservation, user })) ) ) );
接下来你可以订阅这个合并后的Observable,同时获取两个请求的结果:
this.combinedData$.subscribe({ next: ({ reservation, user }) => { this.reservation = reservation; this.users = user; }, error: (err) => { // 处理请求错误 console.error('请求失败:', err); } });
关键说明:
filter操作符:用来过滤第一个请求的结果,只有当字段N为true时,才会继续发起第二个请求,完全匹配你“先检查N再决定是否发起第二个请求”的需求。switchMap内部嵌套map:这里没有直接返回第二个请求的Observable,而是通过map把第一个请求的reservation和第二个请求的user打包成一个对象,这样整个流传递的就是包含两个数据的对象,订阅时就能同时拿到两者。
内容的提问来源于stack exchange,提问作者Anjey Noname
相关产品推荐
相关产品推荐

