Tengo una llamada API, donde uso tubería.
getCountriesListNights(){ const r = this.http.get<any>(this.APIUrl + "/WorldMapDataNights?&year=" + this.selectedYear + "&month=" + this.selectedMonth +"&gender=" + this.selectedGender + "&age="+this.selectedAge + "&quarter=" + this.selectedQuarter) .pipe(map((res) => {return res.map((res: { id: any; countryName: any; value: any; year: any; name: string; multiPolygon: any[] }) =>({countryName: res.countryName, id: res.id, value: res.value, year: res.year, name: res.name, multiPolygon: res.multiPolygon }))})) .subscribe(res =>{ this.renderMapObject(res); }); };Funciona bien, puedo cambiar la salida, pero quiero dividir el valor por el valor de otra API, cuando los nombres de los países son los mismos en ambas API. (Quiero dividir res.value por otherapi.value.)
¿Qué puedo hacer ahora?
Algo como esto haría el truco
getCountriesListNights(){ const r = this.http.get<any>(this.APIUrl + "/WorldMapDataNights?&year=" + this.selectedYear + "&month=" + this.selectedMonth +"&gender=" + this.selectedGender + "&age="+this.selectedAge + "&quarter=" + this.selectedQuarter).pipe(map((res) => {return res.map((res: { id: any; countryName: any; value: any; year: any; name: string; multiPolygon: any[] }) =>({countryName: res.countryName, id: res.id, value: res.value, year: res.year, name: res.name, multiPolygon: res.multiPolygon }))})).subscribe(res =>{ console.log(res); this.renderMapObject(res); this.http.get<any>(this.APIUrl + "/yourSecondApiURL").subscribe(otherapiRes =>{ const finalResult = res.value / otherapiRes .value; console.log(finalResult); } }); };no es bonito y te vendría bien algo como
const res = await this.http.get<any>("...firstApiUrlAndMapping...").toPromise(); const res2 = await this.http.get<any>("...secondApiUrlandMapping...").toPromise(); finalResult = res.value/res2.value;pero ambas formas deberían funcionar bien.
EDITAR
Un ejemplo básico de ejecutar dos llamadas http una dentro de la otra sería
const res = this.http.get<any>('https://reqbin.com/echo/get/json').subscribe(res =>{ console.log(res); this.http.get<any>('https://reqbin.com/echo/get/json').subscribe(otherapiRes =>{ console.log(otherapiRes); console.log('Both Results:' + res.success + ' -- ' + otherapiRes.success); }); });De acuerdo, para lograr el objetivo, necesita una respuesta cumplida de dos fuentes. En general, Promise.all() te da lo que necesitas.
Hay varias formas de lograr su necesidad en el mundo de RxJS. Por ejemplo, el operador zipWith devuelve un flujo que notifica una matriz de resultados (su fuente y sus entradas de argumento).
Una muestra con la que puedes jugar:
of('Foo') .pipe( delay(1000), tap(() => console.log('Foo succeeded')), zipWith( of('Bar').pipe( delay(2000), tap(() => console.log('Bar succeeded')) ), of('Baz').pipe( delay(2500), tap(() => console.log('Baz succeeded')) ) ), // You can process and transform the outcome map(([foo, bar, baz]) => foo + bar + baz) ) .subscribe(result => { console.log('All succeeded:', result); });