如何在方法中将多个可观察对象合并为第一个可观察对象完成和 return 作为新可观察对象
how to combine multiple observables on first observable complete and return as new observable in method
我是使用 RxJs 运算符的初学者,我需要一个方法,它从服务中调用 5 个可观察对象,它应该仅在第一个可观察对象完成后从服务中获取数据,然后组合所有可观察对象并转换为一个新的可观察对象和 return 一个函数中的新可观察对象。下面的代码说明了这种情况。
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,但在我的第一个 observable 完成后我无法实现。感谢有人可以帮助我解决这个问题。
我相信你要找的是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;
}
你可以试试这个:
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 /* ... */)
)
)
我是使用 RxJs 运算符的初学者,我需要一个方法,它从服务中调用 5 个可观察对象,它应该仅在第一个可观察对象完成后从服务中获取数据,然后组合所有可观察对象并转换为一个新的可观察对象和 return 一个函数中的新可观察对象。下面的代码说明了这种情况。
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,但在我的第一个 observable 完成后我无法实现。感谢有人可以帮助我解决这个问题。
我相信你要找的是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;
}
你可以试试这个:
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 /* ... */)
)
)