Angular 8 Resolver - Как получить данные от одного преобразователя в качестве входных данных для другого преобразователя?

У меня есть 2 REST API. Требуются данные из обоих API. В то же время 2-й API принимает входные данные от API 1 в качестве параметра.

GET api/one --> {id: 3}, этот идентификатор ответа требуется в GET api/two?inputFromApiOne=3 --> {name: 'SS'}

Мой окончательный ответ, доступный в компоненте, должен быть -

{
  "id": 3, -- from API One
  "name": "SS" -- from API Two
}

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

Я также пытался получить данные из обоих API в распознавателе1. Я использовал flatMap, но тогда я получаю данные только из 2-го API.

resolve(route: ActivatedRouteSnapshot) {
  return this.myService.getDataFromApiOne(route.params.id).pipe(flatMap(data => {
    return this.myService.getDataFromApiTwo(data.someKey.id);
  }));
}

person Shubhashish Shukla    schedule 12.04.2020    source источник
comment
Ваша конфигурация маршрутизатора?   -  person Kenny    schedule 12.04.2020


Ответы (2)


Надеюсь, вы указали оба преобразователя в конфигурации маршрута, например

 {
    path: '', 
    component: MyComponent,
    resolve: {
      fromResolverOne: Resolver1
      fromResolverTwo: Resolver2
   }
}

И затем в вашем компоненте

const resolverOneData = this.route.snapshot.data['fromResolverOne'];
const resolverTwoData = this.route.snapshot.data['fromResolverTwo'];
person Kenny    schedule 12.04.2020
comment
Данные, доступные в resolverOneData, должны использоваться Resolver2 для получения resolverTwoData. - person Shubhashish Shukla; 12.04.2020

Я смог добиться этого только с помощью await async.

@Injectable()
export class MyResolverService implements Resolve<any> {

 constructor(private myService: MyService) { }

 async resolve(route: ActivatedRouteSnapshot) {
   const dataFromApiOne = await 
   this.myService.getMediumDetails(route.params.id).toPromise();
   const dataFromApiTwo = await this.myService.getPageConfig(dataFromApiOne.id).toPromise();
   return { dataFromApiOne, dataFromApiTwo };
 }
}

А затем в своем компоненте я просто взял данные из моментального снимка маршрута.

this.dataFromBothApi = this.route.snapshot.data.myData
person Shubhashish Shukla    schedule 12.04.2020