如何在第一个可观察完成时合并多个可观察对象并在方法中作为新的可观察对象返回

时间:2020-05-27 05:51:40

标签: angular rxjs-observables

我是使用RxJs运算符的初学者,我有一个方法的要求,该方法从服务中调用5个可观察对象,并且只有在第一个可观察对象完成后才应从服务中获取数据,然后合并所有可观察对象并转换为新的observable并在函数中返回一个新的observable。以下代码说明了这种情况。

GetAllDetails(): Observable<AllDetails> {

const user = this.service.getUser() // Observable<User>
const firstDetails = this.service.getFirstDetail() // returns Observable<FirstDetail>
const secondDetails = this.service.getSecondDetail() // returns Observable<SecondDetail>
const thirdDetails = this.service.getThirdDetail() // returns Observable<ThirdDetail>
const fourthDetails = this.service.getFourthDetail() // returns Observable<FourthDetail>

// need to return a value that something compatible with Observable<AllDetails>
// so the logic should check if user info available then do combining all observable values and 
// return as new observable 

return of(new AllDetails(first, second, third, fourth) 
}

我尝试使用CombineLatest和switchMap,但是在完成第一个可观察到的操作后无法实现此目的。感谢有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

我相信您正在寻找的是forkJoin

forkJoin是最简单的方法,当您需要等待多个HTTP请求被解决时。

示例:

public fetchDataFromMultipleSources(): Observable<any[]> {
let response1 = this.http.get(url1).subscribe((response) => {
  let response2 = this.http.get(url2);
  let response3 = this.http.get(url3);
  return forkJoin([response1, response2, response3]);
});
return response1;
}

答案 1 :(得分:1)

您可以尝试以下方法:

return user.pipe(
  last(), // Get the lastest value when the `user$` completes
  switchMap(
    user => conditionOnUser 
      ? forkJoin({ first: firstDetails, second: secondDetails /* ... */ })
      : of(null)
  ),
  map(
    detailsOrNull => !detailsOrNull
      ? false // No user info available
      : new AllDetails(detailsOrNull.first, detailsOrNull.second /* ... */)
  )
)