Как объединить массив Observables в один Observable того же типа возврата - PullRequest
0 голосов
/ 12 января 2019

То, что я пытаюсь достичь, это поместить несколько наблюдаемых 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);
            })
        );
    }

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

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

0 голосов
/ 12 января 2019

Я думаю, вы ищете forkJoin:

When all observables complete, emit the last emitted value from each.

https://www.learnrxjs.io/operators/combination/forkjoin.html

Вот пример, который может вам помочь:

https://stackblitz.com/edit/angular-seuqh5

...