Как объединить данные из данных Observables, извлеченных внутри цикла, созданного для другого результата Observable в Angular 7 и RsJS? - PullRequest
1 голос
/ 24 июня 2019

У меня есть метод, который возвращает Observable с данными автомобиля:

getCars(): Observable<any> {
    return this.get(`/cars`);
}

И еще один, который возвращается Obserable с автозапчастями:

getCarParts(carName: string): Observable<any> {
    return this.get(`carParts?name=${carName}`);
}

getCars возвращает в данные массив JSON carNames (псевдокод):

{
   carName: "Scoda"
},
{
   carName: "BMV"
}

автомобильные данные возвращают различные автомобильные имена для определенного carName (псевдокод). Для Scoda:

{
   carDetail: "SCO1"
},
{
   carDetail: "SCO2"
}

Для BMW:

{
   carDetail: "BMW1"
},
{
   carDetail: "BMW2"
}

Я хотел бы получить все автомобили с помощью getCars, а для каждого автомобиля получить сведения об автомобиле и объединить эти данные в один массив. Результат должен выглядеть следующим образом (псевдокод):

{
   carDetail: "SCO1"
},
{
   carDetail: "SCO2"
}    
{
   carDetail: "BMW1"
},
{
   carDetail: "BMW2"
}

Если бы я только что синхронно извлекал массивы (не Obserables), это выглядело бы примерно так (псевдосернистый код):

var cars = getCars();
var carDetails = new Array();
foreach (car in cars)
{
   var details = getDetails(car.carName);
   foreach(detail in details) carDetails.push(details);
}

Так что я хотел бы объединить данные из Obserables, извлеченные на основе данных из другого Obserable, в один массив. Как сделать это, используя Angular и RxJS наиболее подходящим способом?

1 Ответ

3 голосов
/ 24 июня 2019

Вот мой взгляд на вашу проблему:

Stackblitz

  cars = of([
    { name: 'Scoda' },
    { name: 'BMW' }
  ]);

  partsScoda = of([
    { part: 'SCO1' },
    { part: 'SCO2' }
  ]);

  partsBMW = of([
    { part: 'BMW1' },
    { part: 'BMW2' }
  ]);

  ngOnInit() {
    this.cars.pipe(
      switchMap(cars => forkJoin(
        cars.map(car => this['parts' + car.name]))
      )
    ).pipe(
      map(res => Array.prototype.concat.apply([], res))
    ).subscribe(res => console.log(res));
  }

Начните с запроса списка автомобилей, затем сопоставьте этот массив с массивом запросов,После того как каждый запрос сделан, он будет возвращать массив массивов: просто сгладьте этот массив, чтобы получить конечный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...