Получение данных для распознавателя маршрутов путем выполнения http-запросов таким образом, чтобы результат второго зависел от результата первого - PullRequest
0 голосов
/ 29 октября 2018

У меня есть распознаватель в моем модуле маршрутизации

{
    path: 'path1',
    component: FirstComponent,
    resolve: {
     allOrders: DataResolver
    }

}

И тогда в моей функции разрешения есть

resolve(): Observable<Array<string>> {

    return this.serviceA.getAllfooNames()
    .map(result=> {

         /* result is an array of strings*/
         return this.serviceB.getAllBarNames(result[0])

         /*orders is also supposed to be an array of strings*/     
          .map(orders=> return orders)                        
    });

 }
}

Я хочу, чтобы значение ордеров сохранялось против клавиши allOrders . Я хочу передать массив orders как данные в снимке ActivatedRoute. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете использовать смесь concatMap и zip:

resolve(): Observable<Array<string>> {
  return this.serviceA.getAllfooNames().pipe(
    concatMap((names) => 
      zip(...names.map((name) => this.serviceB.getAllBarNames(name)))
    ),
    map((...names) => 
      names.reduce((acc, curr) => acc.concat(curr), [])
    ) 
  ); 
}

Это вернет все строки, возвращенные из вызова serviceB, в одном большом массиве строк.

В основном то, что он делает, вы называете getAllfooNames, с concatMap вы ждете, пока этот запрос не будет завершен, который возвращает набор имен в строке. После этого вы берете их с помощью оператора zip. Этот оператор выполняет все наблюдаемые, передаваемые туда, используя метод карты массива, и выдает, как только все они завершены.

Затем он выбирается на карте, которая получает несколько строковых массивов в качестве параметров. Затем вы используете reduce, чтобы создать его в одном большом массиве.

...