gpt4 book ai didi

angular - 如何将 Observable 数组合并为具有相同返回类型的单个 Observable

转载 作者:行者123 更新时间:2023-12-02 20:08:22 26 4
gpt4 key购买 nike

我想要实现的是将一些http请求可观察值推送到一个数组中,然后组合所有响应并返回一个可观察值。

由于所有 http 请求都使用相同类型的“User”进行解析,因此我只想等待所有请求都解析,然后我可以从 getUsers() 函数返回包含所有用户的单个可观察值。

我陷入了 return merge(observableRequests) 部分,因为我无法获得正确的返回类型,而且我不太熟悉 Rxjs 函数。

这是我的三个相关函数。

    getMyUser(): Observable<User> {
return this.service.get(`${this._userPath}me`).pipe(
map((serviceUser: any) => {
return parseUser(serviceUser);
}));
}

getUsers(): Observable<User[]> {
return this.getMyUser()
.pipe(switchMap((user: User) => {
const activeProvidersIds = this._getActiveProvidersIds(user.providers);
const observableRequests = activeProvidersIds.map((id: number) => this.getUserRequest(id));
return merge(observableRequests);
}));
}

getUserRequest(facDbk: number): Observable<User[]> {
return this.service.get(`${this._providerPath}${facDbk}/users`).pipe(
map((serviceUsers: any) => {
return parseUsers(serviceUsers);
})
);
}

感谢任何帮助。

最佳答案

ForkJoin 将在您的用例中工作,您可以遵循此代码

import { Observable, of, forkJoin } from 'rxjs'; 
import { map } from 'rxjs/operators';

interface user {
id : string;
name: string;
}

// mimicking api requests
const httpRequest = (num): Observable<user> =>{
return Observable.create((observer)=>{
const [id,name] = [`id-${num}`,`name-${num}`];
setTimeout(()=>{
observer.next({id,name});
observer.complete();
},num*1000);
});
}

//push array of request observables and return single observable
// you can push any number of request here
const makeRequestInParallel = ():Observable<user> =>{
const reqs:Observable<user>[] = [httpRequest(1),httpRequest(2),httpRequest(3)];
return forkJoin(...reqs);
}


makeRequestInParallel().subscribe((result)=>{
console.log(result);
});


点击stablitz-link

关于angular - 如何将 Observable 数组合并为具有相同返回类型的单个 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54155443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com