как объединить несколько наблюдаемых при первом завершении наблюдаемого и вернуть в качестве нового наблюдаемого в методе - PullRequest
0 голосов
/ 27 мая 2020

Я новичок в использовании операторов Rx Js, и у меня есть потребность в методе, который вызывает 5 наблюдаемых из службы и должен получать данные из службы только после завершения первого наблюдаемого, затем объединить все наблюдаемые и преобразовать в новую наблюдаемую и вернуть новую наблюдаемую с помощью функции. Приведенный ниже код иллюстрирует сценарий.

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 ]

1 голос
/ 27 мая 2020

Вы можете попробовать это:

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 /* ... */)
  )
)
1 голос
/ 27 мая 2020

Я считаю, что вы ищете 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;
}
...